在 JDK 中 String 的 String 参数的构造方法里面有这样的说明
初始化一个新创建的 String 对象,使其表示与参数相同的字符序列;换句话说,新创建的字符串是参数字符串的副本。除非需要原始的显式副本,否则不需要使用此构造函数,因为字符串是不可变的。
如图:
怎么理解其中的“新创建的字符串是参数字符串的副本。”这句话
我做了如下实验 代码:
import java.lang.reflect.Field;
public class StringTest {
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
String strabc1 = "abc";
Class<? extends String> aClass = strabc1.getClass();
Field abcValue = aClass.getDeclaredField("value");
abcValue.setAccessible(true);
byte[] chars = (byte[]) abcValue.get(strabc1);
chars[0] = 'd';
chars[1] = 'e';
chars[2] = 'f';
String newStrAbc1 = new String("abc");
String newStrAbc2 = new String("abc");
System.out.println(strabc1);
System.out.println("abc".equals("def"));
System.out.println(newStrAbc1.equals("def"));
System.out.println(newStrAbc1 == newStrAbc2);
System.out.println(newStrAbc1.equals(newStrAbc2));
}
}
运行结果截图:
如图改变了“abc”的值之后字符串常量池中“abc”实际的值已经改变为“def”所以用“abc”equals“def”的时候返回 true ,我不理解的是文档中说的“副本”具体是怎么个副本法? 21 行代码输出的是 true 证明 new String 的这种方式创建出来的字符串也受字符串常量的影响,new String 创建出来的字符串使用==判断输出 false 比如如图 23 行代码输出的是 false ,按网上所说是地址不一样,地址不一样,但是又受字符串常量池的影响,我就疑惑这个文档中的“副本”是指什么概念?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.