1.他new一个对象时,直接传一个常量字符串,这个是存放在字符串池中的,他的引用是在堆中开辟了一块空间放他的地址吗?
首先,楼主要区分开String s = "abc";和String s = new String("abc");的区别。
String s = "abc";是先在字符串池中找是否有"abc",没有就创建其对象并返回"abc"的引用给s。
String s = new String("abc"); 也是先在字符串池中找是否有"abc",没有就创建其对象,因为有new的存在还会在堆内存中创建String对象存储"abc",并将对象的引用(不是字符串池中的)返回给s。
2.replace方法中用r换掉了m,但这个操作并没有保存为什么,到下面的时候又还是用的amit去做的判断呢
String s1 = new String("amit");
System.out.println(s1.replace('m','r'));
System.out.println(s1);
String s3 = "arit";
String s4 = "arit";
String s2 = s1.replace('m','r'); //这后面加System.out.println(s2);是"arit"。
System.out.println(s2 == s3);
System.out.println(s3 == s4);
System.out.println(s1.replace('m','r')); 是返回一个替换后的字符串,调用他并不改变原来的字符串,在这s1并没有改变。
String s2 = s1.replace('m','r'); 楼主是根据上面的System.out.println(s1); 认为这里s2是"amit",其实这里s2的内容已经是
"arit"了。至于 System.out.println(s2 == s3); 为什么是false就可以用前面说到的字符串常量池解释了,s3指向的是字符串常量池中的"arit",而s2是s1经过替换后得到的字符串,s2这里也是指向堆内存。 |