java == 的问题,看上去简单

sswt 2006-02-15 04:15:07
String a = "ab";
String c = "a";
String d = "b";
System.out.println(a==(c+d));
System.out.println(a==("a"+"b"));

结果是 false true

为什么?
...全文
266 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
usaspy 2006-02-16
  • 打赏
  • 举报
回复
Java虚拟机会维护一个内部的滞留字符串对象的列表(唯一字符串的池)来避免在堆内存中产生重复的String对象。当JVM从class文件里加载字符串字面量并执行的时候,它会先检查一下当前的字符串是否已经存在于滞留字符串列表,如果已经存在,那就不会再创建一个新的String对象而是将引用指向已经存在的String对象,JVM会在内部为字符串字面量作这种检查,但并不会为通过new关键字创建的String对象作这种检查。当然你可以明确地使用String.intern()方法强制JVM为通过new关键字创建的String对象作这样的检查。这样可以强制JVM检查内部列表而使用已有的String对象。
  所以结论是,JVM会内在地为字符串字面量维护一些唯一的String对象,程序员不需要为字符串字面量而发愁,但是可能会被一些通过new关键字创建的String对象而困扰,不过他们可以使用intern()方法来避免在堆内存上创建重复的String对象来改善Java的运行性能。下一小节会向大家展示更多的信息
zx2002027 2006-02-16
  • 打赏
  • 举报
回复
c+d后的值存入了一个临时变量,该变量地址和a不同
“a”+“b”相当与“ab”,虚拟机会在常量池中查找“ab”,如果匹配则临时分配一变量指向该入口,那么地址就和a一样了
不知道这样理解对不对
水晶平衡木 2006-02-16
  • 打赏
  • 举报
回复
usaspy(行走的鱼) 贴的对,补充点简单说明如下:

Java中处理String常量的方式是使用的享元模式,就是每生成一个新的常量String都会先检查这个常量的String是否已经在内存中存在,如果有,则直接返回这个常量String的地址。

但是处理变量的默认方式就不同,两个String变量相加总是生成的一个新的String,相当于new了一个新的String。

所以,两个变量相加得到的是一个新建的String,而两个常量相加得到的却是已有的那个常量的地址了。
zjm66688 2006-02-15
  • 打赏
  • 举报
回复
== 比较的是内存地址
treeroot 2006-02-15
  • 打赏
  • 举报
回复
这种方式和编译器有关
"a"+"b" 被编译时处理为"ab"
但是c+d是运行时处理的(因为是变量)
vvpang 2006-02-15
  • 打赏
  • 举报
回复
== 比较的是类的相同。

同意 polarman(北极人) 的意见
sswt 2006-02-15
  • 打赏
  • 举报
回复
'=='比较的是内存地址,不是值
----------------------------------------


这个我明白。
为什么"ab" 和 "a" + "b" 的地址相同
而和 c + d 的地址不同呢?


mlyb 2006-02-15
  • 打赏
  • 举报
回复
'=='比较的是内存地址,不是值
sswt 2006-02-15
  • 打赏
  • 举报
回复
使用a.equals()
-------------------------
我是问为什么会处先这种情况,不是说不知道用a.equals()这个比较。

这里跟equals()没有关系
sswt 2006-02-15
  • 打赏
  • 举报
回复
感觉说的不清楚啊,加油,等待中。

问题的关键是 c + d的时候做了什么?


String a = "ab";
String c = "a";
String d = "b";
String e = "a"+"b";

System.out.println((c+d).hashCode());
System.out.println(("a"+"b").hashCode());
System.out.println("ab".hashCode());
System.out.println(a.hashCode());


hashCode是这个对象的唯一标示,==的判断是根据引用的地址,可否简单的理解成hashCode的值?
Paripatetic 2006-02-15
  • 打赏
  • 举报
回复
==是判断两个是否为同一个对象实例的两个副本
若要判断内容相同用a.equals(b)
yonghar 2006-02-15
  • 打赏
  • 举报
回复
使用a.equals()....

==是判断两个是否为同一个对象实例。
gifted1982 2006-02-15
  • 打赏
  • 举报
回复
'=='比较的是内存地址,不是值
String a = "ab";
String c = "a";
String d = "b";

分别在内存中创建了三个对象,占用了不同的地址,比较址可以用c.equals(c+d);
tiky_6228769 2006-02-15
  • 打赏
  • 举报
回复
这答案在“JAVA编程思想”里有
polarman 2006-02-15
  • 打赏
  • 举报
回复
"ab"这个字符串常量只会分配一次内存,"a"+"b"等同与"ab"
对于对象类型,==比较的是内存地址
chg2008 2006-02-15
  • 打赏
  • 举报
回复
有意思,如何解释呢?
sswt 2006-02-15
  • 打赏
  • 举报
回复
顶一个
renkunpong 2006-02-15
  • 打赏
  • 举报
回复
mark~

62,614

社区成员

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

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