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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 耿渊博 中级黑马   /  2014-3-29 17:58  /  1391 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 耿渊博 于 2014-3-31 10:15 编辑

a==b,一般是判断对象地址的,为什么会出现下面情况
  1. package com.Thread;

  2. public class IntegerDemo {

  3.         public static void sop(Object obj){
  4.                 System.out.println(obj);
  5.         }

  6.         
  7.         public static void main(String[] args) {

  8.                
  9.                 Integer m = 128;
  10.                 Integer n = 128;
  11.                 sop("m==n:"+(m==n) );//false
  12.                
  13.                 Integer a = 127;
  14.                 Integer b = 127;
  15.                 sop("a==b:"+(a==b));//true
  16.         }

  17. }
复制代码


结果:第一个为false
         第二个为true

评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 神马都是浮云

查看全部评分

6 个回复

倒序浏览
Integer有取值范围为-128~127   符合值范围时候,进入创建好的静态IntergerCache管理区中,去取值,所以比较值位置真; 当不符合-128 127值范围时候。开辟新的内存空间,不属于IntergerCache管理区,就不想等了。也就是假。
回复 使用道具 举报
自动装箱时(-128~127)会共用一个对象。
享元模式 (flyweight)
有很多小的对象,他们的很多属相相同,把他们变成一个对象。相同的为内部属性,不同的为外部属性。
希望对你有帮助!
回复 使用道具 举报
本帖最后由 zhangbingyuan 于 2014-3-29 18:26 编辑

Java中的Integer是有个常量池的概念的,如果Integer对象装箱的int类型的值介于-128~127之间,那么当建立这个int类型数据的Integer对象的时候,它就会存在于常量池中,下次再要建立值介于-128~127之间的Integer对象的时候,就会常量池中去找,如果存在具有相同值的Integer对象,那么新建立的Integer对象就会指向常量池中已经存在的那个Integer对象,也就是说不会再新建一个Integer对象。当然如果 要封装的int类型的值不再上述那个范围的话,就会另外new一个Integer对象。所以根据这种机制,才会产生你那种运行结果。

点评

回答的非常到位,精准!!  发表于 2014-3-30 19:42

评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 赞一个!

查看全部评分

回复 使用道具 举报
  1. public class IntegerDemo {

  2.         public static void sop(Object obj){
  3.                 System.out.println(obj);
  4.         }

  5.         //Integer对象有一个常量池, Integer m = 128这个语句会吧int类型的128自动封箱成Integer对象
  6.             //Integer对象装箱的int类型的值介于-128~127之间创建且只创建一个对象。以后如果还有用这个范围里的对象时
  7.             //都会直接在常量池中找,不会再创建新的。如果超出范围,就会另外创建对象,有几个创建几个。
  8.         public static void main(String[] args) {

  9.                         //Integer m = 128这个语句会吧int类型的128自动封箱成Integer对象
  10.                 Integer m = 128;
  11.                 Integer n = 128;
  12.                 //很明显。128超出了范围,所以会为m创建一个Integer对象,为n另外创建一个Integer对象
  13.                 //即两个对象不是同一个对象,即对象的地址不同
  14.                 sop("m==n:"+(m==n) );//false
  15.                
  16.                
  17.                 Integer a = 127;
  18.                 Integer b = 127;
  19.                  //127在-128~127范围之间。所以在为a创建了一个Integer对象后,再为b创建对象时,
  20.                 //会现在常量池中寻找是否存在内部封装int值为127的对象,存在,就直接拿来用
  21.                 //即在这里,a、和b指向的是同一个对象,也是同一个地址。
  22.                 sop("a==b:"+(a==b));//true
  23.         }

  24. }
复制代码


评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 赞一个!

查看全部评分

回复 使用道具 举报
Integer在内存只分配一个字节,一个字节的有效值范围为-128~127,128超出了这个范围,吗m,n执行不同的对象
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马