A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 殷挥笔 中级黑马   /  2013-11-10 22:46  /  1253 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. public class Test {
  2. public static void main(String[] args) {
  3. String s = "abc";
  4. s.substring(1);
  5. s.replace("bc", "xyz");
  6. System.out.println(s);
  7. String value = new String ("abc");
  8. System.out.println(s == value);
  9. }
复制代码
运行结果为:
abc
false

求解这是为什么?

8 个回复

倒序浏览
String类的subString()方法返回一个新字符串,它是此字符串的一个子字符串。
你虽然调用了这个方法,但是你并没有让它的返回结果重新赋给s对象。
replace()方法同理。
所以,s对象仍然指向字符串"abc"。
至于为什么==号比较返回false,是因为两个对象的内存地址不同。
String value = new String ("abc");这句代码中的new关键字会在内存中又创建一个字符串对象,
所以两个字符串对象的内存地址不同,返回false。

点评

+1  发表于 2013-11-11 09:06
FFF
+1  发表于 2013-11-10 23:10
回复 使用道具 举报
public class Test {
public static void main(String[] args) {
String s = "abc";                     
s.substring(1);                     //截取1角标以后的元素  ,但是对象s没有改变 还是“abc”字符串对象一旦在堆内存中就不会改变
s.replace("bc", "xyz");                                                   //将“bc”替换为“xyz”, 同理 是还是"abc”
System.out.println(s);                                 // 打印的结果为“abc”
String value = new String ("abc");             //创建了一个新的字符串对象 new String("abc")
System.out.println(s == value);             // s 和value 是两个不同的字符串 ,不是同一对象 所以运行结果为  false
}
不知道这样解释你能否理解,欢迎交流

评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1

查看全部评分

回复 使用道具 举报
hel 中级黑马 2013-11-11 04:36:52
板凳
String一旦创建了对象他在内存中的数据就不会改变,
s.substring(1);         你并没有建立对象引用,
String ss = s.replace("bc", "xyz");      当你建立引用后,如果你在打印 S 的值还是abc,     

评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1

查看全部评分

回复 使用道具 举报
1.string类是final类型,一经赋值,无法更改,对String 对象的任何操作都是无效的,只要不重新指向该对象
2.对象s和对象value 是两个不同的对象,指向内存中不同的操作地址符,所以为假
回复 使用道具 举报
String s = "abc";
s.substring(1);
s.replace("bc", "xyz");
String一旦创建了对象他在内存中的数据就不会改变,
这个你只进行了一次赋值,后面俩个方法有返回值但是你没传给s呀!
这样写就行了
String s = "abc";
s=s.substring(1);
s=s.replace("bc", "xyz");
回复 使用道具 举报
帖子已分类
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马