package app;public class jdbc { public static void main(String[] args) {
Double d = new Double (4.2);
System.out.println(d.equals(4.2));
System.out.println(d==4.2);
}
}
运行结果:true 
        true第一个true容易理解,Double类里重写了equals方法,equals比较Double对象里值是否相等,
第二个如何理解呢?
按照常理,d是一个对象的引用,"栈"里存放的是对象的地址,怎么会等于4.2呢?
高手赐教

解决方案 »

  1.   

    JAVA5.0开始的新功能 自动拆箱(unboxing)
      

  2.   

    查了下,书上说Boolean Byte Character \u0000 -\u007f Integer -128-127 为了节省内存,对于这些包装器对象的两个实例,他们基本值相同时,他们总是==.
      

  3.   

    反编译代码:Compiled from "SweetShop.java"
    public class SweetShop extends java.lang.Object{
    public SweetShop();
      Code:
       0: aload_0
       1: invokespecial #1; //Method java/lang/Object."<init>":()V
       4: returnpublic static void main(java.lang.String[]);
      Code:
       0: new #2; //class java/lang/Double
       3: dup
       4: ldc2_w #3; //double 4.2d
       7: invokespecial #5; //Method java/lang/Double."<init>":(D)V
       10: astore_1
       11: getstatic #6; //Field java/lang/System.out:Ljava/io/PrintStream;
       14: aload_1
       15: ldc2_w #3; //double 4.2d
       18: invokestatic #7; //Method java/lang/Double.valueOf:(D)Ljava/lang/Double;
       21: invokevirtual #8; //Method java/lang/Double.equals:(Ljava/lang/Object;)Z
       24: invokevirtual #9; //Method java/io/PrintStream.println:(Z)V
       27: getstatic #6; //Field java/lang/System.out:Ljava/io/PrintStream;
       30: aload_1
       31: invokevirtual #10; //Method java/lang/Double.doubleValue:()D
       34: ldc2_w #3; //double 4.2d
       37: dcmpl
       38: ifne 45
       41: iconst_1
       42: goto 46
       45: iconst_0
       46: invokevirtual #9; //Method java/io/PrintStream.println:(Z)V
       49: return}从第十三行可以看出,JVM自动调用了Double的doubleValue()方法将Double转换成了double类型,也就是JDK5.0以上的新特性(自动拆箱功能)
      

  4.   

    java虚拟机的体系结构:
    对象放在堆中,基本数据类型压入栈,所以对象取引用,equls方法是比较两个对象的内容是否一样,而==是比较两个对象的引用是否一样,回答你的问题还是
    JAVA5.0开始的新功能   自动拆箱(unboxing)
      

  5.   

    楼上几位高明!
    我现在对JDK5.0还是了解不多,惭愧!
      

  6.   

    查了下,书上说Boolean   Byte   Character   \u0000   -\u007f   Integer   -128-127   为了节省内存,对于这些包装器对象的两个实例,他们基本值相同时,他们总是==.
    试试
       Integer a = new Integer(100);
       Integer b = new Integer(100);
       System.out.println(a==b);
    结果为False