String 的比较问题。

wangmoxhn 2008-09-08 08:14:16
String s = "yz";
String s1 = "xyz";
String s2 = "x"+"yz";
String s3 = "x"+new String("yz");
String s4=new String("xyz");
String s5 = "x"+s;
System.out.println(s1==s2);true
System.out.println(s1==s3);false
System.out.println(s1==s4);false
System.out.println(s4==s3);false
System.out.println(s2==s5);false

能详细解释下么?
...全文
1509 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
newtypebao 2008-09-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jabeginner 的回复:]
对像的比较要用到,对象的equals方法。直接的比较只是内存地址的比较。
[/Quote]
Sou2012 2008-09-09
  • 打赏
  • 举报
回复
对象的equals方法。

直接的比较只是内存地址的比较
lyguo 2008-09-09
  • 打赏
  • 举报
回复
学习
wangmoxhn 2008-09-09
  • 打赏
  • 举报
回复
谢谢各位了!!
大概了解了!
cqd19881103 2008-09-09
  • 打赏
  • 举报
回复
new String("yz");
这是创建另一个内存.
getter 2008-09-09
  • 打赏
  • 举报
回复
誰能解釋下s3
getter 2008-09-09
  • 打赏
  • 举报
回复
s1==s2返回true,是因為String s2 = "x"+"yz";"x"和"yz"都是常字串,編譯時應該會優化為"xyz",那麼由於是以常量來賦值,會先在字符串池中找有沒有己存在的,所以s1==s2為true,可以參考一下字符串的intern方法
haoxiongok 2008-09-08
  • 打赏
  • 举报
回复
s1==s2 返回true --这个比较的是内存地址而不是值
s1.equals(s2)返回true --这个比较的是内容不是内存地址
acd001 2008-09-08
  • 打赏
  • 举报
回复
对像的比较要用到,对象的equals方法。直接的比较只是内存地址的比较。
luxiaoxun 2008-09-08
  • 打赏
  • 举报
回复
http://hi.baidu.com/xun1573/blog/item/42617ad8acab333332fa1c63.html
==操作符会返回true如果一些引用指向一个相同的对象但不会判断String对象的内容是否相同
==是比较两字符串的地址是否相同,也就是是否是同一个字符串的引用。
String.equals()方法会返回true如果被操作的String对象的内容相同。
dijunjun 2008-09-08
  • 打赏
  • 举报
回复
……你要去面试吗?
software_jianghai 2008-09-08
  • 打赏
  • 举报
回复
[Quote=引用楼主 wangmoxhn 的帖子:]
String s = "yz";
String s1 = "xyz";
String s2 = "x"+"yz";
String s3 = "x"+new String("yz");
String s4=new String("xyz");
String s5 = "x"+s;
System.out.println(s1==s2);true
System.out.println(s1==s3);false
System.out.println(s1==s4);false
System.out.println(s4==s3);false
System.out.println(s2==s5);false

能详细解释下么?

[/Quote]

用字面量的形式声明的字符串是存放到栈中的,栈中字符串池是可复用的,上述描述中是s1.s2是位于同一个内存地址
new出来的String都是在堆中新开辟一片空间的,内存地址是不一样的,上述描述中s3,s4,s5都是在堆中新产生一个对象,内存地址并不一样,只是内容相同而已
zdcwcfriend 2008-09-08
  • 打赏
  • 举报
回复
你可以这样试一下

s1="x"+new String("y");
s2=="x"+new String("y");

然后用==和equals 总之==比较内存地址,equals比较值
zdcwcfriend 2008-09-08
  • 打赏
  • 举报
回复


s5是连接后新的字符串
覆盖s5原有的值 没有开辟新的内存

楼主问的问题 很基础 也很重要
我也在学习中 可以互相交流下
wangmoxhn 2008-09-08
  • 打赏
  • 举报
回复
String s5 = "x"+s;

这种情况是直接去常量池找 还是直接开辟新的内存呢??
tz_dzg 2008-09-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zdcwcfriend 的回复:]
String s="" 这种是直接开辟内存空间 然后把值放进去
但是NEW的时候是创建一个新的内存空间然后指向这个值.

String s1="1",s2="1" 这种赋值是先在查找字符串池中找有没有值 有的话直接引用同一个地址,没有的话另外开辟

例如:
s1==s2 返回true --这个比较的是内存地址而不是值
s1.equals(s2)返回true --这个比较的是内容不是内存地址


但是如果是 new String("1") new String("1") 他们2个==时返回FALS…
[/Quote]
justinavril 2008-09-08
  • 打赏
  • 举报
回复
这个问题嘛 请看http://ganlisxn.javaeye.com/blog/228607

弄清楚String s2 = "x"+"yz";
String s3 = "x"+new String("yz");
的区别就知道怎么回事了
zdcwcfriend 2008-09-08
  • 打赏
  • 举报
回复
String s="" 这种是直接开辟内存空间 然后把值放进去
但是NEW的时候是创建一个新的内存空间然后指向这个值.

String s1="1",s2="1" 这种赋值是先在查找字符串池中找有没有值 有的话直接引用同一个地址,没有的话另外开辟

例如:
s1==s2 返回true --这个比较的是内存地址而不是值
s1.equals(s2)返回true --这个比较的是内容不是内存地址


但是如果是 new String("1") new String("1") 他们2个==时返回FALSE equals返回true
jabeginner 2008-09-08
  • 打赏
  • 举报
回复
对像的比较要用到,对象的equals方法。直接的比较只是内存地址的比较。

62,614

社区成员

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

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