Java Learning Notes
[toc]
Java Basic
Data Type
Int and Integer
(1) 由于Integer变量实际上是对一个Integer对象的引用,所以两个通过new生成的Integer变量永远是不相等的。
Integer i = new Integer(100);
Integer j = new Integer(100);
System.out.print(i == j); //false
因为new生成的是两个对象,其内存地址不同
(2) Integer变量和int变量比较时,只要两个变量的值是相等的,则结果为true。
Integer i = new Integer(100);
int j = 100;
System.out.print(i == j); //true
因为包装类Integer和基本数据类型int比较时,java会自动拆包装为int,然后进行比较,实际上就变为两个int变量的比较
(3) 非new生成的Integer变量和new Integer()生成的变量比较时,结果为false。
Integer i = new Integer(100);
Integer j = 100;
System.out.print(i == j); //false
在JDK 5.0之前,你从未见过Integer j = 100;的表达式,因为类与字面值是不能通用的,除了String。而在JDK 5.0中,这种表达式是可以的!因为编译器成为Integer j = Integer.valueOf(100)
情况描述
1 | public class Test { |
java在编译Integer x = yyy ;时,会翻译成为Integer x = Integer.valueOf(yyy)。而java API中对Integer类型的valueOf的定义如下,对于-128到127之间的数,会进行缓存,Integer i = 127时,会将127进行缓存,下次再写Integer j = 127时,就会直接从缓存中取,就不会new了。如果超过128就会重新new一个新对象
解析原因: 归结于java对于Integer与int的自动装箱与拆箱的设计,是一种模式:叫享元模式(flyweight)。
- 加大对简单数字的重利用,Java定义在自动装箱时对于值从–128到127之间的值,它们被装箱为Integer对象后,会存在内存中被重用,始终只存在一个对象。
- 而如果超过了从–128到127之间的值,被装箱后的Integer对象并不会被重用,即相当于每次装箱时都新建一个 Integer对象。