原始类型:boolean,char,byte,short,int,long,float,double;
包装类型:Boolean,Character,Byte,Short,Integer,Long,Float,Double;
上面是比较常见的数据类型;下面说一下int 和Integer的区别吧
Ingeter是int的包装类,Integer变量必须实例化后才能使用,实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象,常自动装箱拆箱;
(简单一点说,装箱就是自动将基本数据类型转换为包装器类型;拆箱就是自动将包装器类型转换为基本数据类型。)
而int则是直接存储数据值 ,int的初值为0,Ingeter的初值为null。除此之外还有区别,请看代码:
int a=55;
Integer b=55;
System.out.println(a);
System.out.println(b);
System.out.println(a==b); //b会自动拆箱为int,所以不会报错
这样看仿佛int 和integer没有差别(可以大于128,因为这是integer的拆箱,相当于俩个int比较);
那在看看下面代码;
Integer a=1005;
Integer b=1005;
System.out.println(a);
System.out.println(b);
System.out.println(b==a);
而当俩个值是1005的integer类型进行比较时,就产生了报错;
为什么?
对于Integer,在(-128,128]之间只有固定的256个值,所以为了避免多次创建对象,我们事先就创建好一个大小为256的Integer数组SMALL_VALUES,所以如果值在这个范围内,就可以无视地址(同一地址)进行值的比较。也就是说这之间的Integer值进行==比较时只是进行int原生数据类型的数值比较,而超出-128~127的范围,进行==比较时是进行地址及数值比较。
从虚拟机方面解释:
integer比int更快一些,在定义(-128~128)之内的数时,integer只在jvm虚拟机开辟了一个地址,而int就需要开辟多个,而我们定义的数也多半在(-128~128)之内,所以integer就能空出更多空间给内存,加快运行速率。