A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 liuelxiwd 于 2013-5-18 08:45 编辑
  1. Integer a1 = 100;  
  2. Integer a2 = 100;  
  3. System.out.println(a1 == a2);   // true  

  4. Integer b1 = new Integer(100);  
  5. Integer b2 = new Integer(100);  
  6. System.out.println(b1 == b2);   // false  

  7. Integer c1 = 150;  
  8. Integer c2 = 150;  
  9. System.out.println(c1 == c2);   // false
复制代码
关于==和equals的问题好多人都问题,哪位大侠来给大家总结一个集合文档,惠及一下小黑马们·~~

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

5 个回复

倒序浏览
你的代码中没有涉及到equals()方法,都是使用的==判断内存地址;
第一个判断涉及到享元模式,“Integer a1 = 100;”这种创建对象方式,当值在-128~127之间时,再使用Integer a2 = 100时,则为了减少内存使用,a2会指向a1;
第二个判断:Integer b1 = new Integer(100);  由于两条语句都使用了new,所以内存中创建了两个对象,内存地址不同;
第三个判断:Integer c1 = 150; 由于数值超出了-128~127,不再使用享元模式,所以内存中创建了两个对象,内存地址不同;

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

回复 使用道具 举报
楼上正解
回复 使用道具 举报
好吧,自己语言组织的不好,希望你能意会
当两个整形恰能放在一个byte类型中时,这时候不开辟新的Integer  比如
Integer a1 = 127;  

Integer a2 = 127;  

System.out.println(a1 == a2);  //true
a1和a2在同一个byte中,(没有超过255)这是就相当于
byte a1=127;
byte a2=127;
System.out.println(a1 == a2);   即比较的是大小
当a1与a2和大于255即超过了byte型范围,就会开辟新的Integer空间
这时候比较的就是两个Integer实例了,地址当然不一样咯
不知道说的是否明白,不妥之处,望批评指正

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

回复 使用道具 举报
二楼正解
第一个判断涉及到享元模式,“Integer a1 = 100;”这种创建对象方式,当值在-128~127之间时,再使用Integer a2 = 100时,则为了减少内存使用,a2会指向a1;
第二个判断:Integer b1 = new Integer(100);  由于两条语句都使用了new,所以内存中创建了两个对象,内存地址不同;
第三个判断:Integer c1 = 150; 由于数值超出了-128~127,不再使用享元模式,所以内存中创建了两个对象,内存地址不同;
---------------------------------
补充二楼 :
==和equals的区别
1.==可以用来比较基本数据类型和引用数据类型  
= =比较基本数据类型时,比较的是数据的值,比较引用数据类型时,比较的是内存中的地址。
2.equals只能比较引用数据类型,在没有被复写的情况下(Object中的方法) 也是比较的内存中的地址。  
如果被复写了,按照复写的方式进行比较。如String是按字符串自然顺序大小进行比较。  


评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

回复 使用道具 举报
因为要封装的原始类型超过了一个字节,所以不再进行缓存。也就是所谓的flyweight(享元模式)
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马