Java的String.intern()的用途是什么?
我知道有两种在Java中创建String的方法:
String a = "aaa";String b = new String("bbb");
通过第一种方式,Java一定会在字符串池中创建一个String对象并对其进行a
引用。(假设“ aaa”以前不在池中。)
使用第二种方法,将在堆中创建一个对象,但是jvm还会在字符串池中创建一个对象吗?
在这篇关于Java的字符串池的问题中,@ Jesper说:
如果您这样做:
String s = new String("abc");
那么池中将有一个String对象,一个代表文字“ abc”的>,并且池中没有一个单独的String对象,其中包含池对象的>内容的副本。
如果是这样,则每次使用时,都会new String("bbb");
在池中创建一个对象“
bbb”,这意味着通过上述两种方式,java始终会在池中创建一个字符串对象。那是intern()
用来干什么的呢?在docs
http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#intern()中,它说:
调用intern方法时,如果池已经包含等于equals(Object)方法确定的此String对象的字符串,则返回池中的字符串。否则,将此String对象添加到池中,并返回对此String对象的引用。
这意味着在某些情况下池中没有字符串,这可能吗?哪一个是对的?
回答:
我们的String
对象可以通过两种基本方式进入池:
- 在源代码(例如)中使用文字
"bbb"
。 - 使用
intern
。
intern
用于当您有一个String
不是池中的其他对象时。例如:
String bb = "bbb".substring(1); // substring creates a new objectSystem.out.println(bb == "bb"); // false
System.out.println(bb.intern() == "bb"); // true
或略有不同:
System.out.println(new String("bbb").intern() == "bbb"); // true
new String("bbb")
确实创建了两个对象…
String fromLiteral = "bbb"; // in poolString fromNewString = new String(fromLiteral); // not in pool
…但更像是特例。它创建两个对象是因为"bbb"
引用了一个对象:
字符串文字是对类
String
[…] 的实例的引用。而且,字符串文字总是引用class的相同实例
String
。
并new String(...)
创建它的副本。
但是,有许多String
不使用文字即可创建对象的方式,例如:
- 所有
String
执行某种突变的方法。(substring
,split
,replace
等) String
从诸如aScanner
或a之类的输入中读取aReader
。- 至少一个操作数不是编译时常量时的串联。
intern
使您可以将它们添加到池中,或检索现有对象(如果有)。在大多数情况下,String
不需要s,但是可以将其用作优化,因为:
- 它可以让您与比较
==
。 - 由于重复项可以被垃圾回收,因此可以节省内存。
以上是 Java的String.intern()的用途是什么? 的全部内容, 来源链接: utcz.com/qa/413234.html