如果在字符串常量池中添加了字符串文字,并且每个String方法都在创建一个新的String对象,那是否意味着这些方法返回的String对象是否被添加到常量池中?
"String".replace('g','G') == "String".replace('g','G')
上面的代码打印为false,即使替换的结果是“StrinG”,因为replace方法返回一个新的String对象然后它恰好发生了“==”的两边都是不同的String对象碰巧有相同的字符序列是“StrinG”?
**编辑:**由Pshemo评论,是的,我确实知道“==”和“等于()”之间的区别,问题是如果有任何机会,方法输出的字符串被添加也在恒定的游泳池上。
答案 0 :(得分:5)
来自替换文档:
返回一个新字符串,该字符串是用newChar替换此字符串中所有出现的oldChar而生成的。
原始源代码:
public String replace(char oldChar, char newChar) {
if (oldChar != newChar) {
int len = count;
int i = -1;
char[] val = value; /* avoid getfield opcode */
int off = offset; /* avoid getfield opcode */
while (++i < len) {
if (val[off + i] == oldChar) {
break;
}
}
if (i < len) {
char buf[] = new char[len];
for (int j = 0 ; j < i ; j++) {
buf[j] = val[off+j];
}
while (i < len) {
char c = val[off + i];
buf[i] = (c == oldChar) ? newChar : c;
i++;
}
return new String(0, len, buf);
}
}
return this;
}`
我知道,String是不可变的,我们有一个很酷的字符串池,但在这种情况下我们有两个强引用,我的意思是两个相同字符串的NEW实例。 由于我们有两个新实例,这意味着我们有两个不同的内存地址。
http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#replace(char,%20char)