public static void main(String[] args) {
Integer a=1;
Integer b=2;
Integer c=3;
Integer d=3;
Integer e=321;
Integer f=321;
Long g=3L;
System.out.println(c==d);true
System.out.println(e==f);false
System.out.println(c==(a+b));true
System.out.println(c.equals(a+b));true
System.out.println(g==(a+b));true
System.out.println(g.equals(a+b));false
}
}
反编译的代码
Integer a = Integer.valueOf(1);
Integer b = Integer.valueOf(2);
Integer c = Integer.valueOf(3);
Integer d = Integer.valueOf(3);
Integer e = Integer.valueOf(321);
Integer f = Integer.valueOf(321);
Long g = Long.valueOf(3L);
System.out.println(c == d);
System.out.println(e == f);
System.out.println(c.intValue() == a.intValue() + b.intValue());
System.out.println(c.equals(Integer.valueOf(a.intValue() + b.intValue())));
System.out.println(g.longValue() == a.intValue() + b.intValue());
System.out.println(g.equals(Integer.valueOf(a.intValue() + b.intValue())));
在自动装箱时对于值从–128到127之间的值,它们被装箱为Integer对象后,会存在内存中被重用,所以范例4.6中使用==进行比较时,i1 与 i2实际上参考至同一个对象。如果超过了从–128到127之间的值,被装箱后的Integer对象并不会被重用,即相当于每次装箱时都新建一个Integer对象,所以范例4.7使用==进行比较时,i1与i2参考的是不同的对象。
源代码
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);
}
static final Integer cache[] = new Integer[-(-128) + 127 + 1];
static {
for(int i = 0; i < cache.length; i++)
cache[i] = new Integer(i - 128);
}
}
分享到:
相关推荐
通过对"java-puzzlers"源代码的学习,读者可以加深对Java语法、内存管理、异常处理、并发编程等多个方面的理解,并提升编程技巧。这些知识不仅适用于初学者,对于有一定经验的开发者来说,也是巩固和扩展Java知识...
在Java面试中,面试官经常会提出一些看似...以上就是Java面试中的一些陷阱问题及其详细解答,涵盖了基本语法、面向对象、集合框架、多线程、异常处理等多个方面。理解并掌握这些知识点对于面试和实际开发都至关重要。
Java支持自动装箱和拆箱,这是一种语法糖,允许程序员在基本数据类型和其对应的包装类之间自动转换。例如,`Integer i = 10;`是自动装箱的例子,而`int j = i;`则是自动拆箱的例子。需要注意的是,这种便利性也可能...
- **3.2.1 int和Integer的区别**:对比了基本类型`int`与包装类`Integer`之间的差异,包括自动装箱与拆箱的概念。 - **3.2.2 原始数据类型的分类**:概述了Java中的所有原始数据类型,并比较了它们的特性和适用...
- **自动装箱与拆箱**:Java提供了自动装箱(primitive to wrapper)和拆箱(wrapper to primitive)的功能,需要注意装箱后的对象引用可能会带来的性能影响。 - **溢出问题**:对于有符号的整数类型,当数值超过...
4. **数据类型转换**:注意自动装箱和拆箱可能导致的问题。 5. **字符串操作**:使用StringBuilder或StringBuffer代替频繁拼接String。 #### 四、Java客户端方面陷阱 客户端开发时可能会遇到的问题: 1. **网络...
1. 类型转换:Java是一种静态类型语言,但类型转换时可能出现问题,如自动装箱拆箱可能导致的意外行为,或者是不恰当的强制类型转换导致的ClassCastException。 2. 对象引用:Java中的对象引用有时会让人迷惑,例如...
1. **基本语法与数据类型**:SCJP考试会测试对Java基础语法的理解,如变量声明、数据类型(包括原始类型和引用类型)、运算符优先级等。笔记可能会特别强调容易混淆的点,比如自动装箱拆箱可能导致的类型转换异常。 ...
- **自动装箱**:在某些情况下,JavaScript会自动将原始类型转化为对象类型,这被称为自动装箱。 #### 高级特性 对于那些希望进一步探索JavaScript高级特性的学习者来说,还有一些额外的内容可供参考: - **构造...
在Java编程过程中,即使是经验丰富的开发者也可能会遇到一些常见的陷阱和误区。以下是对标题和描述中提到的关键知识点的深入解析: ### 1. 使用 `instanceof` 运算符 `instanceof` 是一个二元运算符,用来检查对象...
《Java面试宝典2011版》涵盖了...以上是对《Java面试宝典2011版》中提及的知识点的详细解析,涵盖了Java的基础语法、面向对象特性、异常处理、线程处理等多个方面,有助于深入理解和掌握Java语言的关键概念和技术细节。
了解它们之间的转换,如装箱和拆箱,以及如何避免潜在的陷阱,如比较Integer对象的相等性。此外,熟悉Object类的方法如equals()和hashCode(),以及String类的独特性质,如不可变性,也是很重要的。 对象和实例的...