java中的128陷阱

原始类型: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就能空出更多空间给内存,加快运行速率。

 

 

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值