问答详情
源自:3-2 Java 中基本类型和包装类之间的转换

怎么理解包装类装箱中的内存地址问题如下?

double a = 91.5;

double b=new Double(a);

double  c=a;

         System.out.println(b==a);
        System.out.println(c==a);
        System.out.println(b==c);

运行结果为true,true,false

提问者:Bourne4076356 2016-10-31 20:02

个回答

  • 绿色蝈蝈拜见
    2016-11-19 15:43:45
    已采纳

    你的代码我运行了一遍,但是返回的却是3个true。
    可能你会觉得包装类对应的是对象,那么它和基本类直接进行==操作应该是false。这本身是没错的,但是问题在于,如果你的Java版本是1.5及以后,那么做比较时Java会进行自动拆箱操作,所以实质上变成了两个基本类型的比较,那么结果自然是true。参见以下代码:

    double a = 9;
    Double b = new Double(9); 
    Double c = new Double(9);
    System.out.println(a==b);
    System.out.println(a==c);
    System.out.println(b==c);

    结果是true,true,false。最后那个相当于是两个对象的比较,没有拆箱操作,自然比较内存地址,那么自然就是错误的了。

    另外学习Java最好还是把Java版本升到1.7左右,版本过低很多功能不支持,可能会跑出错误的结果误导人。

    祝好。







  • 绿色蝈蝈拜见
    2016-11-19 15:32:39

    你的代码我运行了一遍,但是返回的却是3个true。

    实际上,对于包装类和其对应的基本类型来说,在用==比较时只是在比较单纯的数值,并没有涉及内存地址的问题。


  • Bourne4076356
    2016-10-31 20:16:00

    Double g=new Double(91.5);
            System.out.println(g==a); 结果为true

    我自己的理解是这儿的==只是比较值是否相同,b==c比较的是引用地址是否相同~