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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王陶成 中级黑马   /  2012-9-8 08:44  /  1924 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 王陶成 于 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")就不能使用常量池呢

7 个回复

倒序浏览
本帖最后由 全海波 于 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图解:

评分

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

查看全部评分

回复 使用道具 举报
本帖最后由 孙沛 于 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同时指向他们,所以他们就相等了
回复 使用道具 举报
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

*/
回复 使用道具 举报
因为你new 了 就是对象 开辟内存空间了 不能用==  ;应该是用equal  有;一班只有数值之间的比较才用== 字符串都是equal
回复 使用道具 举报
全海波 发表于 2012-9-8 08:45
class IntegerDemo
{
public static void main(String[] args)

挺详细,谢啊
回复 使用道具 举报
以沫 发表于 2012-9-8 09:30
因为你new 了 就是对象 开辟内存空间了 不能用==  ;应该是用equal  有;一班只有数值之间的比较才用== 字 ...

这个比较直观。。。
回复 使用道具 举报

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
}
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马