[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生成的是两个对象,其内存地址不同

img

(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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Test {
public static void main(String[] args) {

// 在-128~127 之内的数
Integer i = 127;
Integer j = 127;
System.out.println( i==j ); //true

// 在-128~127 之外的数
Integer m = 128;
Integer n = 128;
System.out.println( m==n ); //false

// 直接在堆中new一个对象
Integer k = new Integer(100);
}
}

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)。

  1. 加大对简单数字的重利用,Java定义在自动装箱时对于值从–128到127之间的值,它们被装箱为Integer对象后,会存在内存中被重用,始终只存在一个对象。
  2. 而如果超过了从–128到127之间的值,被装箱后的Integer对象并不会被重用,即相当于每次装箱时都新建一个 Integer对象。

img