在Java中Integer类是比较常用的类;
对于Integer i = new Integer(1);
Integer ii = Integer.valueOf(1);
都是得到一个Integer对象,但是Integer.valueOf()的效率高,因为其用到了缓存机制。
-------------------------------------------------------------------------------------------------------------------------------------
例:Integer i0 = Integer.valueOf(59);
Integer i1 = Integer.valueOf(59);
System.out.println(i0==i1);
返回的结果为true,
注:当整数范围在-128<i<=127时,Integer.valueOf返回的是同一个对象。
----------------------------------------------------------------------------------------------------------------------------------------
Intrger i2 = new Integer(59);
Intrger i3 = new Integer(59);
System.out.println(i2==i3);
返回的结果为false,
注:new Integer()返回的是不同的对象,
----------------------------------------------------------------------------------------------------------------------------------------
Integer m1 = Integer.valueOf(59);
Integer n1 = new Integer(59);
System.out.println(m1==n1);
返回的结果为false,
----------------------------------------------------------------------------------------------------------------------------------------
那么:Integer i=100,i1=100;Integer i2=188,i3=188;请问i2==i3么?i==i1么?
Integer与Integer间的比较,从jdk1.5开始,有“自动装箱”这么一个机制,在byte-128到127范围内(ps整型的八位二进制的表示的范围为-128到127),如果存在了一个值,再创建相同值的时候就不会重新创建,而是引用原来那个,但是超过byte范围还是会新建对象。
综上,i==i1返回结果为true,i2==i3返回结果为false。自动拆箱机制,基本数据类型和对象比较的时候,对象会自动拆箱为基本数据类型再比较,比较的就是里面的值而不是地址,
例: Integer m = new Integer(1);
int n = 1;
System.out.println(m==n);
返回的结果为true;
对象m经过拆箱过程先变成int m = 1;
----------------------------------------------------------------------------------------------------------------------------------------
从String机制来看,返回的结果不应该会是如此才对。“==”是判断对象所存的地址,而Integer的哈希码即是括号里面的数值,在判断“==”的时候,对于对象来说是比较两者在内存中的地址,对于一个是int,一个是integer,“==”比较的是数值!因为int是原始数据类型,也叫简单数据类型,而Integer的复杂数据类型,也叫引用数据类型!
例:
public static void main(String[] args){
Integer i = new Integer(59);
int i1 = 59;
System.out.println("new Integer and int:"+(i==i1)); //new Integer and int:true
System.out.println("------------------------------");
Integer i2 = new Integer(59);
Integer i3 = 59;
System.out.println("new Integer(59) and new Integer(59):"+(i==i2)); //new Integer(59) and new Integer(59):false
System.out.println("new Integer and Integer:"+(i2==i3)); //new Integer and Integer:false
System.out.println("------------------------------");
Integer i4 = 59;
System.out.println("Integer and Integer:"+(i3==i4)); //Integer and Integer:true
System.out.println("Integer and int:"+(i1==i4)); //Integer and int:true
System.out.println("------------------------------");
Integer i0 = Integer.valueOf(59);
Integer ii0 = 59;
Integer i00 = new Integer(59);
System.out.println("Integer.valueof and Integer:"+(i0==ii0)); //Integer.valueof and Integer:true
System.out.println("Integer.valueof and new Integer:"+(i0==i00)); //Integer.valueof and new Integer:false
System.out.println("-------------------------------");
Integer i5 = Integer.valueOf(59);
Integer j = Integer.valueOf(200);
Integer j1 = Integer.valueOf(200);
//在-128到127范围内的Integer.valurOf的比较
System.out.println("Integer.valueOf(59) and Integer.valueOf(59):"+(i0==i5));//Integer.valueOf(59) and Integer.valueOf(59):true
//不在-128到127范围内的Integer.valurOf的比较
System.out.println("Integer.valueOf(200) and Integer.valueOf(200):"+(j==j1));//Integer.valueOf(200) and Integer.valueOf(200):false
}
参考xxqi1229的专栏--java基础------new Integer(1)和Integer.valueOf(1)的区别和Toni的博客--对java中int与Integer的一些理解