如果我创建一个字符串对象为
String s=new String("Stackoverflow");
Run Code Online (Sandbox Code Playgroud)
将String对象仅在堆中创建,或者它还在String常量池中创建一个副本.
提前致谢.
如果你调用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(),但它对我来说从未如此重要:)
在这种情况下,您正在构造一个全新的String对象,并且该对象将不会在常量池中共享.请注意,为了构造您的new String()对象,您实际上传递了一个String常量.这String常是在常量池中,但你通过创建的字符串new不指向同一个,即使它们具有相同的值.
如果你这样做,String s = "Stackoverflow"那么s将包含对池中实例的引用,也有一些方法可以让你String在创建池后添加s.
| 归档时间: |
|
| 查看次数: |
659 次 |
| 最近记录: |