您的位置:程序门 -> java -> j2se / 基础类



又一equals和==区分的问题


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


又一equals和==区分的问题
发表于:2008-01-13 13:23:04 楼主
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呢?
高手赐教
发表于:2008-01-13 13:44:101楼 得分:0
java5.0开始的新功能   自动拆箱(unboxing)
发表于:2008-01-13 13:47:502楼 得分:0
查了下,书上说boolean   byte   character   \u0000   -\u007f   integer   -128-127   为了节省内存,对于这些包装器对象的两个实例,他们基本值相同时,他们总是==.
发表于:2008-01-13 13:55:003楼 得分:0
反编译代码:

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: return

public   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以上的新特性(自动拆箱功能)

发表于:2008-01-13 13:56:084楼 得分:0
我是楼上的,将第十三行改为第三十一行
发表于:2008-01-13 13:56:395楼 得分:0
2楼正解
发表于:2008-01-13 13:57:136楼 得分:0
java虚拟机的体系结构:
对象放在堆中,基本数据类型压入栈,所以对象取引用,equls方法是比较两个对象的内容是否一样,而==是比较两个对象的引用是否一样,回答你的问题还是
java5.0开始的新功能       自动拆箱(unboxing)
发表于:2008-01-13 14:58:057楼 得分:0
楼上几位高明!
我现在对jdk5.0还是了解不多,惭愧!
发表于:2008-01-14 01:03:598楼 得分:0
查了下,书上说boolean       byte       character       \u0000       -\u007f       integer       -128-127       为了节省内存,对于这些包装器对象的两个实例,他们基本值相同时,他们总是==.


试试
      integer   a   =   new   integer(100);
      integer   b   =   new   integer(100);
      system.out.println(a==b);
结果为false


快速检索

最新资讯
热门点击