int与Integer的区别

来源:互联网 发布:怎么选择打印机端口 编辑:程序博客网 时间:2024/06/03 10:14

int是java基本数据类型,初始值为0;

Integer是类,是对int的包装,初始值为null;


更加细致的对比如下:

先看代码:

public class Main {public static void main(String[] argss) {Integer a = 127;// java在编译的时候,被翻译成-> Integer a = Integer.valueOf(127);Integer b = 127;Integer a1 = 128;Integer b1 = 128;Integer b2 = new Integer(127);System.out.println("compare a==b:" + (a == b));// 结果为trueSystem.out.println("compare a1==b1:" + (a1 == b1));// 结果为falseSystem.out.println("compare a==b2:" + (a == b2));// 结果为false, b2的引用指向堆,而a指向专门存放他的内存(常量池),他们的内存地址不一样,所以为falseInteger c = new Integer(1);Integer d = new Integer(1);System.out.println("compare c==d:" + (c == d));// 结果为false,因为对象不一样Integer e = new Integer("1");Integer f = new Integer("1");Integer e1 = Integer.valueOf("1");Integer f1 = Integer.valueOf("1");Integer e2 = Integer.valueOf("128");Integer f2 = Integer.valueOf("128");System.out.println("compare e==f:" + (e == f));// 结果为false,因为对象不一样System.out.println("compare e1==f1:" + (e1 == f1));// 结果为trueSystem.out.println("compare e2==f2:" + (e2 == f2));// 结果为falseInteger g = 1;Integer h = new Integer("1");System.out.println("compare g==h:" + (g == h));// 结果为falseSystem.out.println("-------------------------------");int i = 128;Integer j = 128;Integer k = new Integer(128);Integer l = new Integer("128");// Integer会自动拆箱为int,所以为trueSystem.out.println("compare i==j:" + (i == j));// 结果为trueSystem.out.println("compare i==k:" + (i == k));// 结果为trueSystem.out.println("compare i==l:" + (i == l));// 结果为true}}
出现第9行与第10行的原因是:

其实java在编译Integer a = 127的时候,被翻译成-> Integer a = Integer.valueOf(127);所以关键就是看valueOf()函数了。只要看看valueOf()函数的源码就会明白了。JDK源码的valueOf函数式这样的:

public static Integer valueOf(int i) {assert IntegerCache.high >= 127;if (i >= IntegerCache.low && i <= IntegerCache.high)return IntegerCache.cache[i + (-IntegerCache.low)];return new Integer(i);}
看一下源码大家都会明白,对于-128到127之间的数,会进行缓存,Integer a = 127时,会将127进行缓存,下次再写Integer b = 127时,就会直接从缓存中取,就不会new了。

总结:

①无论如何,Integer与new Integer不会相等。不会经历拆箱过程,b2的引用指向堆,而a指向专门存放他的内存(常量池),他们的内存地址不一样,所以为false
②两个都是非new出来的Integer,如果数在-128到127之间,则是true,否则为false;java在编译Integer a = 128的时候,被翻译成-> Integer a = Integer.valueOf(128);而valueOf()函数会对-128到127之间的数进行缓存
③两个都是new出来的,都为false
④int和integer(无论new否)比,都为true,因为会把Integer自动拆箱为int再去比

相关引用:

http://blog.sina.com.cn/s/blog_7f033dcf01017ljx.html

http://www.cnblogs.com/liuling/archive/2013/05/05/intAndInteger.html


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 手机丢了微信红包有钱怎么办 手机换号了微信密码忘记怎么办 电脑的宽带连接被删了怎么办 彩票中奖但是彩票老板打错了怎么办 支付宝交手机费没有到账怎么办 支付宝借充电宝丢了怎么办 支付宝还信用卡还没有到账怎么办 支付宝冲话费充错了怎么办 支付宝充话费多久冲错了怎么办 支付宝付款成功商家没收到怎么办 qq钱包被冻结了微信怎么办 q币不小心充多了怎么办 u盘装系统就一个图标怎么办 淘宝买了东西退货客服不理人怎么办 微信10w限额满了怎么办 微信身份证实名认证超出限额怎么办 微信信用卡消费超过当日限额怎么办 淘宝客服同意退货卖家拒绝怎么办 微信钱包充值话费不到帐怎么办 京东买的显示器过保坏了怎么办 支付宝充话费充错号码是空号怎么办 京东充话费充错了号码该怎么办 微信红包充话费不到账怎么办 支付宝充话费等待第三方发货怎么办 微信充话费显示成功但没收到怎么办 微信退款一直在退款中怎么办 文件大于100发不了微信怎么办 微信的传送文件大于100怎么办 微信钱包话费充值错误怎么办 微信转账到不了账也退不回是怎么办 求人办事微信发红包对方不收怎么办 微信上交了订金对方不退怎么办 交通事故对方伤员堵大门搂腿怎么办 电脑开机桌面文件都没了怎么办 qq飞车手游队长换了微信群怎么办 qq飞车手游登录授权失败怎么办 安装时提示安装包发现错误怎么办 苹果6p升级系统验证失败怎么办 w10开不了机无限重启怎么办 微信朋友圈里的表情图打不开怎么办 金立手机微信启动录音被拒绝怎么办