又一equals和==区分的问题

xc_wangwang 2008-01-13 01: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呢?
高手赐教
...全文
167 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
lvcrosstime 2008-01-14
  • 打赏
  • 举报
回复
查了下,书上说Boolean Byte Character \u0000 -\u007f Integer -128-127 为了节省内存,对于这些包装器对象的两个实例,他们基本值相同时,他们总是==.


试试
Integer a = new Integer(100);
Integer b = new Integer(100);
System.out.println(a==b);
结果为False
lixkyx 2008-01-13
  • 打赏
  • 举报
回复
楼上几位高明!
我现在对JDK5.0还是了解不多,惭愧!
qiuqiupeng 2008-01-13
  • 打赏
  • 举报
回复
java虚拟机的体系结构:
对象放在堆中,基本数据类型压入栈,所以对象取引用,equls方法是比较两个对象的内容是否一样,而==是比较两个对象的引用是否一样,回答你的问题还是
JAVA5.0开始的新功能 自动拆箱(unboxing)
mcluvin 2008-01-13
  • 打赏
  • 举报
回复
2楼正解
michaelye18 2008-01-13
  • 打赏
  • 举报
回复
我是楼上的,将第十三行改为第三十一行
michaelye18 2008-01-13
  • 打赏
  • 举报
回复
反编译代码:

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

may310 2008-01-13
  • 打赏
  • 举报
回复
查了下,书上说Boolean Byte Character \u0000 -\u007f Integer -128-127 为了节省内存,对于这些包装器对象的两个实例,他们基本值相同时,他们总是==.
dracularking 2008-01-13
  • 打赏
  • 举报
回复
JAVA5.0开始的新功能 自动拆箱(unboxing)

62,629

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧