字符串常量池中的新String("")会发生什么

pra*_*mar 1 java string

如果我创建一个字符串对象为

String s=new String("Stackoverflow");
Run Code Online (Sandbox Code Playgroud)

将String对象仅在堆中创建,或者它还在String常量池中创建一个副本.

提前致谢.

Jon*_*eet 8

如果你调用intern或使用字符串文字,你只能在常量池中得到一个字符串,据我所知.

无论你调用哪个构造函数重载,new String(...)只要你打电话给你就得到一个常规的新String对象.

在你的情况你也确保有有内容的字符串"Stackoverflow"常量池中,由事实,你正在使用的字符串字面量在所有-但如果它已经存在,不会再添一个.所以把它分开:

String x = "Stackoverflow"; // May or may not introduce a new string to the pool
String y = new String(x);   // Just creates a regular object
Run Code Online (Sandbox Code Playgroud)

此外,调用的结果new String(...)将始终是对所有先前引用的不同引用 - 与使用字符串文字不同.例如:

String a = "Stackoverflow";
String b = "Stackoverflow";

String x = new String(a);
String y = new String(a);

System.out.println(a == b); // true due to constant pooling
System.out.println(x == y); // false; different objects
Run Code Online (Sandbox Code Playgroud)

最后,字符串被添加到常量池的确切时间对我来说从来都不清楚,对我来说也不重要.我猜它可能是在类加载(该类使用的所有字符串常量,立即加载),但它可能是基于每个方法.有可能找到一个特定的实现使用intern(),但它对我来说从未如此重要:)

  • @DavidWallace:但是文字的使用本身不会增加常量池 - 它确保值在*常量池中,但它可能已经存在.我在编辑中澄清了这一点. (3认同)

Tim*_*m B 5

在这种情况下,您正在构造一个全新的String对象,并且该对象将不会在常量池中共享.请注意,为了构造您的new String()对象,您实际上传递了一个String常量.这String在常量池中,但你通过创建的字符串new不指向同一个,即使它们具有相同的值.

如果你这样做,String s = "Stackoverflow"那么s将包含对池中实例的引用,也有一些方法可以让你String在创建池后添加s.