今天看《深入理解JAVA虚拟机》,发现自己对自动装箱和拆箱有一些误解,在此写下来:
问题1、
Integer a = 3;
Integer b = 3;
请问 a==b 返回 true 还是 false ?
开始毫不犹豫选择了false ,明显 a和b不是同一个对象。结果亲自运行这段代码发现返回true。
问题2、
Integer c = 333;
Integer d= 333;
请问 c==d 返回 true 还是 false ?
亲自试验之后问题2返回false。c.equals(d) 返回true。
不解了吧?如果问题1返回true,问题2为什么返回false呢?
首先说下自动装箱:Integer自动装箱时是调用valueOf(int i)来完成自动装箱的,再来看Integer的valueOf(int i)的源码:
public static Integer valueOf(int i) {
final int offset = 128;
if (i >= -128 && i <= 127) { // must cache
return IntegerCache.cache[i + offset];
}
return new Integer(i);
}
原来-128-127之间的整数返回的是缓存,大于这个区间的才返回新的Integer对象。
再来看看Integer的equals方法:
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
不难看出Integer对象的equals方法比较的是Integer拆箱之后的值。自动拆箱是调用initValue方法来实现的。
总结:对于基本类型的包装类型,Byte、Short、Integer、Long、Character 都存在这样的缓存机制,大家在使用字面量初始化对象,然后进行== 比较的时候需要留心注意。
Float、Double没有这样的机制。
Boolean 计较特使,字面量的初始化后,== 操作会返回Boolean类静态变量的计较,也可以当做一种缓存吧。
相关推荐
为了编写更高效、更可维护的Java代码,开发者需要了解自动装箱和拆箱的工作原理、应用场景以及性能影响,并遵循最佳实践来避免潜在的性能问题。通过合理使用基本数据类型、显式装箱和拆箱、利用缓存范围、避免在高频...
对于基本数据类型与包装类之间的转换,Java提供了一个非常便利的功能——自动装箱和自动拆箱。这些功能极大地简化了编程流程,使代码更加简洁易读。 #### 基本数据类型与包装类 在Java中,**基本数据类型**是指...
“深入理解Java中的装箱和拆箱” 一、什么是装箱?什么是拆箱? 在Java中,每种基本数据类型都有对应的包装器类型,例如int对应Integer、byte对应Byte等。装箱是指将基本数据类型自动转换为包装器类型的过程,而...
总的来说,自动装箱和拆箱是Java语言为了提高开发效率而引入的特性,它简化了基本类型和对象之间的转换,但同时也需要开发者对其潜在的性能影响有所了解。在编写代码时,应根据实际情况选择使用基本类型还是包装类,...
自动装箱和拆箱问题是Java中一个老生常谈的问题了,我们来一些看一下装箱和拆箱中的若干问题。本文先讲述装箱和拆箱基本的东西,再来看一下面试笔试中经常遇到的与装箱、拆箱相关的问题。 以下是本文的目录大纲:...
### 自动装箱与拆箱概念 在Java中,自动装箱是指将基本数据类型自动转换为对应的包装类...通过以上分析,我们可以更深入地理解Java中的自动装箱、拆箱及其对对象比较的影响,这对于编写高效且可读性强的代码非常重要。
装箱(Boxing)是Java自动将基本数据类型转换为对应的包装类的过程。例如,int类型转换为Integer,char类型转换为Character等。这是Java 5引入的自动装箱特性,旨在简化代码,提高开发效率。当我们将一个基本类型...
在Java SE 5及以后的版本中,为了方便开发者使用,引入了自动装箱和拆箱的功能。 一、什么是装箱和拆箱? 装箱(Boxing)是将Java的基本数据类型转换为其对应的包装器类型的自动过程。例如,将int类型转换为...
Java语言在设计时引入了自动装箱和拆箱机制,以方便开发者在基本类型与它们对应的包装类之间进行转换。这个特性在提高编程效率的同时,也...同时,理解Java自动装箱和拆箱的原理,有助于在编写代码时做出明智的选择。
在Java编程语言中,"自动装箱"和"拆箱"是两个重要的概念,它们与"包装器类"紧密相关。这些概念对于理解和编写高效、可靠的代码至关重要,尤其是在处理基本数据类型与对象之间的转换时。在BankingApplication项目中,...
在编程领域,自动装箱和拆箱是面向对象语言中的一种特性,主要应用于基本数据类型与它们对应的引用类型之间的转换。这个"AutoBundle.zip"文件很可能包含了一个关于自动装箱和拆箱的示例项目或者教程,名为...
涵盖了Java语言的关键知识点,包括但不限于其语言特性、面向对象编程的理解、数据类型及其封装类、标识符命名规则、`instanceof`关键字的运用以及Java自动装箱与拆箱机制。 1. **Java语言特点** - **简单易学**:...
Java自动装箱和拆箱优化了基本类型与封装类之间的转换,使得代码更加简洁。 这些知识点是Java程序员面试中常见的问题,涵盖Java的基础、面向对象、数据类型以及语言特性等方面。掌握这些内容对于理解和使用Java语言...
在Java编程语言中,JDK 6版本引入了许多特性,其中自动装箱和拆箱是提升开发效率的重要改进。本文将深入探讨这些知识点,并通过实际示例帮助新手更好地理解和运用。 1. **自动装箱(Autoboxing)** 自动装箱是指将...
Java 1.5 Tiger的发布标志着Java编程语言的重大进步,它引入了许多关键特性,如泛型、枚举、自动装箱和拆箱、可变参数、静态导入以及增强的for循环等。 1. 泛型:Java 1.5引入了泛型,这是一种在编译时检查类型安全...
6. Java自动装箱与拆箱 Java SE 5之后,Java引入了自动装箱与拆箱机制,自动装箱是将基本数据类型转换为相应的封装类实例,拆箱则相反,是将封装类转换回基本数据类型。这一机制极大地简化了Java编程语言的使用,...
这本书的源码是学习和理解Java 5.0新特性的宝贵资源,包括泛型、枚举、自动装箱与拆箱、变量类型推断(如varargs方法)、增强的for循环(foreach)等。通过分析这些源码,开发者可以更好地掌握Java编程的最佳实践和...
3. **自动装箱与拆箱(Autoboxing/Unboxing)**:Java 5.0引入了自动装箱和拆箱机制,使得基础数据类型和对应的包装类之间可以无缝转换。例如,一个整数可以直接赋值给Integer对象,反之亦然,这简化了代码并减少了...
《Java2全方位学习》这本书,基于JDK1.5版本,旨在为初学者提供一个全面了解和学习Java的基础。JDK(Java Development Kit)是Java开发所需的一套工具,包括编译器、解释器、调试器等,对于学习和开发Java程序至关...