黑马程序员技术交流社区

标题: Integer问题 [打印本页]

作者: 王陶成    时间: 2012-9-8 08:44
标题: Integer问题
本帖最后由 王陶成 于 2012-9-8 10:24 编辑

Integer x = new Integer("123");
Integer y = new Integer("123");
System.out.println("x == y : " + (x==y));//false
               
Integer m = 123;
Integer n = 123;
System.out.println("m == n : " + (m == n));//true

为什么结果不同呢。上面的是指向了两个不同的对象,可下面的Integer m = 123自动装箱不是和上面的一样吗?为什么Integer y = new Integer("123")就不能使用常量池呢
作者: 全海波    时间: 2012-9-8 08:45
本帖最后由 全海波 于 2012-9-8 09:18 编辑

class IntegerDemo
{
public static void main(String[] args)
{
  //在堆内存中开辟了两个空间来存放"123",栈内存中的x,y分别指向各自不同的对象,地址不一样,所以结果就为false
  Integer x = new Integer("123");
  Integer y = new Integer("123");
  System.out.println("x == y : " + (x==y));//false
  //因为m与n指向了同一个Inger对象,因为当数值在byte范围内,
  //对于1.5版本的新特性来说,如果该数值已经存在,那么就不会在开辟新的空间
  //也就是说,在内存中有这个“123”这个数值了,当你再声明一个n类类型变量的时候
  //它将不再开辟空间,而是与m直接指向了Integer对象
  Integer m = 123;
  Integer n = 123;
  System.out.println("m == n : " + (m == n));//true
}
}
m,n图解:

x,y图解:


作者: 孙沛    时间: 2012-9-8 09:06
本帖最后由 孙沛 于 2012-9-8 09:10 编辑

Integer x = new Integer("123");
Integer y = new Integer("123");
这个意思是在堆内存中开辟了两个放有123  的空间,栈内存中的x,y分别指向这两个空间,但是他们不相等的

Integer m = 123;
Integer n = 123;
这句话的意思是在栈内存中开辟了一个空间123,x,y同时指向他们,所以他们就相等了

作者: 王德升    时间: 2012-9-8 09:19
class MyTest{

        public static void main(String[] args){

                Integer i1 = new Integer(2);
                Integer i2 = new Integer(2);

                Integer i3 = new Integer("3");
                Integer i4 = new Integer("4");//只要是new就会在堆内存开辟空间,故引用不同。

                Integer i5 = 3;
                Integer i6 = 3;

                Integer i7 = 129;
                Integer i8 = 129;//i7、i8和i5、i6这2个你懂的,因为一个byte之内。
               
                sop(i1 == i2);
                sop(i3 == i4);
                sop(i5 == i6);
                sop(i7 == i8);
       
               
        }
        public static void sop(Object obj){
               
                System.out.println(obj);
        }
}

/*
打印结果:
false
false
true
false

*/
作者: 以沫    时间: 2012-9-8 09:30
因为你new 了 就是对象 开辟内存空间了 不能用==  ;应该是用equal  有;一班只有数值之间的比较才用== 字符串都是equal
作者: 王陶成    时间: 2012-9-8 10:23
全海波 发表于 2012-9-8 08:45
class IntegerDemo
{
public static void main(String[] args)

挺详细,谢啊
作者: 王陶成    时间: 2012-9-8 10:23
以沫 发表于 2012-9-8 09:30
因为你new 了 就是对象 开辟内存空间了 不能用==  ;应该是用equal  有;一班只有数值之间的比较才用== 字 ...

这个比较直观。。。
作者: 武庆东    时间: 2012-9-8 10:29

class IntegerDemo
{
public static void main(String[] args)
{

  Integer x = new Integer("123");
  Integer y = new Integer("123");//在堆内存中开辟了两个空间来存放"123",
  System.out.println("x == y : " + (x==y));//栈内存中的x,y分别指向各自不同的对象,内存地址不一样,所以false

  Integer m = 123;
  Integer n = 123;
  System.out.println("m == n : " + (m == n));//true
}
}





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