【求解】关于判断String对象相等的问题

da_en 2008-11-17 06:38:30
public class Test123 {
private static String s1="string";
public void method(String str1,String str2){
str2=str2+"c";
System.out.println("str1==str2: "+(str1==str2));
}

public static void main(String []a){
String s2 = "string";
String arg="strin"+"g";
System.out.println("s1==arg: "+(s1==arg));
System.out.println("s2==arg: "+(s2==arg));
System.out.println();

Test123 yy = new Test123();
yy.method("abc", "ab");
}
}

运行结果如下:
s1==arg: true
s2==arg: true

str1==str2: false

我想问s1==arg,s2==arg,为什么返回真?
他们不是不同的对象么,不是应该用equals才会返回真么?
str1==str2: false 又作何解释?
头痛中.请教各人达人。
...全文
205 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
ZiSheng 2008-11-17
  • 打赏
  • 举报
回复

public class xx{
public static void main(String[]args){
String s1="phenix1"+"phenix2";//两个字符串常量相加的结果会在常量池创建
String s2="phenix1phenix2";
System.out.println(s1==s2);
String s3="phenix3";
String s4=s3+"phenix4";//当有变量和另一个字符串常量相加时不会在常量池创建结果。
String s5="phenix3phenix4";
System.out.println(s4==s5);
}
}

da_en 2008-11-17
  • 打赏
  • 举报
回复
呵呵,我也是刚注意到的
看了一下,有认识了不少东西
谢谢ZangXT
ZangXT 2008-11-17
  • 打赏
  • 举报
回复
看我在1楼帖的网址,有个全测试。
yunhua1984 2008-11-17
  • 打赏
  • 举报
回复
str1和str2是两个不同的引用,所以是false.
不要误解为指针了
da_en 2008-11-17
  • 打赏
  • 举报
回复
- -
其实是一个面试题来的。
平常都用equals的。明天要去面试,于是就拿出题来做
发现这个东西没理解。
string 这个东西很难看透啊!
ZangXT 2008-11-17
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 da_en 的回复:]
可以给我解释一下method方法里面的str1==str2: false 么?
感觉有些概念混淆。

[/Quote]
不用弄那么清楚。记住一点,你打算比较内容,就使用equals方法,你要比较两个引用是不是指向同一个对象,才用==
da_en 2008-11-17
  • 打赏
  • 举报
回复
可以给我解释一下method方法里面的str1==str2: false 么?
感觉有些概念混淆。
da_en 2008-11-17
  • 打赏
  • 举报
回复
谢谢楼上各位达人
吃了个饭回来发现马上又答案了
:)
ZangXT 2008-11-17
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 yyx14725 的回复:]
这和String连接池有关系
==比的是引用
只有当两个变量同时指向一个地址时
才返回ture
这种形式的String s1 = "string";
在datesegment里的String连接池中创建了一个字符串
而下次String s2不是new出来的话
也会在String连接池找有没有对应的字符串
如果原先有已创建的字符串
那么,不会再新创建
s2也会指向s1的地址
而在连接池中
比的是equals
所以String arg="strin"+"g";
这种拼串的方式得到的和前面一样
也就是…
[/Quote]
常量池,不是连接池。
好像对==和equals也没有真正弄清楚。
yyx14725 2008-11-17
  • 打赏
  • 举报
回复
这和String连接池有关系
==比的是引用
只有当两个变量同时指向一个地址时
才返回ture
这种形式的String s1 = "string";
在datesegment里的String连接池中创建了一个字符串
而下次String s2不是new出来的话
也会在String连接池找有没有对应的字符串
如果原先有已创建的字符串
那么,不会再新创建
s2也会指向s1的地址
而在连接池中
比的是equals
所以String arg="strin"+"g";
这种拼串的方式得到的和前面一样
也就是说s1,s2,arg同时指向一个地址

62,614

社区成员

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

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