我在Kathy Sierra的书中读到,当我们使用像String这样的新运算符创建String时s = new String("abc")在这种情况下,因为我们使用new关键字,Java将在普通(非池)内存中创建一个新的String对象,并且s将参考它.此外,文字"abc"将被放置在池中.
intern()表示如果String池已包含字符串,则返回池中的字符串.否则,将String对象添加到池中,并返回对此String对象的引用.
如果使用new创建的字符串"abc"也将字符串放在池中,那么如果字符串池包含字符串,则intern()表示返回池中的字符串,否则将字符串对象添加到池中.
另外我想知道我们是否使用new创建一个String然后实际创建了多少个对象?
TL; DR:如果你真的需要这样做new String("abc"),你就会知道你需要这样做,你就会明白为什么.这是非常罕见的,说你永远不需要它几乎是有效的.只是用"abc".
长版:
当您拥有代码时new String("abc"),以下事情会在不同时间发生:
"abc"不在实习池中,则创建并放在那里.new String("abc")代码运行:
"abc"对实习池中字符串的引用将传递到String构造函数中.String对象被创建并通过复制的字符初始化String传递到构造函数.String对象将返回给您.如果使用new创建的字符串"abc"也将字符串放在池中,那么为什么
intern()如果String池包含字符串,则返回池中的字符串,否则将字符串对象添加到池中.
因为那是什么intern.请注意,调用intern字符串文字是一个无操作; 字符串文字全部自动实现.例如:
String s1 = "abc"; // Get a reference to the string defined by the literal
String s2 = s1.intern(); // No-op
System.out.println(s1 == s2); // "true"
System.out.println(s1 == "abc"); // "true", all literals are interned automatically
Run Code Online (Sandbox Code Playgroud)
另外我想知道我们是否使用new创建一个String然后实际创建了多少个对象?
您创建至少一个String对象(新的,非实习的对象),可能还有两个(如果文字不在池中;但是,再次,当加载类文件的文字时,该位发生得更早):
String s1 = "abc"; // Get a reference to the string defined by the literal
String s2 = new String(s1); // Create a new `String` object (guaranteed)
System.out.println(s1 == s2); // "false"
String s3 = s2.intern(); // Get the interned version of the string with these characters
System.out.println(s1 == s3); // "true"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1834 次 |
| 最近记录: |