黑马程序员技术交流社区

标题: Integer中的疑问 [打印本页]

作者: 耿渊博    时间: 2014-3-29 17:58
标题: Integer中的疑问
本帖最后由 耿渊博 于 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
作者: 苏伯亚    时间: 2014-3-29 18:11
Integer有取值范围为-128~127   符合值范围时候,进入创建好的静态IntergerCache管理区中,去取值,所以比较值位置真; 当不符合-128 127值范围时候。开辟新的内存空间,不属于IntergerCache管理区,就不想等了。也就是假。
作者: xuehuayous    时间: 2014-3-29 18:22
自动装箱时(-128~127)会共用一个对象。
享元模式 (flyweight)
有很多小的对象,他们的很多属相相同,把他们变成一个对象。相同的为内部属性,不同的为外部属性。
希望对你有帮助!
作者: zhangbingyuan    时间: 2014-3-29 18:25
本帖最后由 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 12:31
  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. }
复制代码



作者: 雪碧拌米饭    时间: 2014-3-30 12:40
Integer在内存只分配一个字节,一个字节的有效值范围为-128~127,128超出了这个范围,吗m,n执行不同的对象




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2