String s = new String(“hello”);
这里将创建两个对象,一个在堆内存中,另一个在字符串池中。
那么,intern()
方法的用途是什么?字符串"hello"
将在堆中以及上述语句执行后的字符串池中可用
答案 0 :(得分:4)
首先。 String s = new String(“hello”);
创建一个不必要的String,不应该使用它。接下来,调用s = s.intern()
将确保"你好"添加到SCP将被返回,因此在堆上创建的第二个字符串将符合GC的条件。
intern()
将字符串添加到SCP(如果尚未存在)。当您知道多次使用String但无法使用 literal 创建String时,通常会使用它。因此,您可以使用intern
而不是创建具有相同值的数千个字符串,而是使用 let point = newObject["PtsBal"] as! String
let formatter = NSNumberFormatter()
formatter.numberStyle = .DecimalStyle
if let number = formatter.numberFromString(point) {
// number is an instance of NSNumber
point = String(number.integerValue)
}
并确保只有一个字符串放入SCP并在1000个位置使用(以及所有其他字符串使用堆上的相同值适用于GC)
答案 1 :(得分:0)
当我们使用new运算符时,究竟是在字符串常量池中创建了对象。?
不是。这里有很多混乱。
"hello"
。new
运算符在堆上创建 new 对象。intern()
方法返回对字符串池中对象的引用,该对象已经存在或由intern()
调用创建。答案 2 :(得分:0)
如果有任何内容用双引号写,并且字符串常量池中不存在,则在字符串常量池中创建一个对象。
至于intern()
方法,它返回字符串的规范表示。
有关进一步了解,请参见
http://www.javatpoint.com/java-string-intern
答案 3 :(得分:0)
intern()方法的用途是什么
intern
字符串可以简单地将字符串与==
(更快)进行比较,而非equals
函数,其中非实习生无法使用==
运算符平等。
String s = new String(“hello”);
new
会将内存分配给堆中的s
而不是内部唯一字符串集,由VM维护,也称为< strong> SCP 。在加载调用时在类中找到的所有字符串都会自动实现(使用强引用),这样可以有效地使用内存。
在intern()
字符串文字上调用s
会在SCP中添加s
的弱引用(短时间)并返回该引用,因此GC
肯定会免费s
消耗的堆内存。
弱引用也将在不再使用时被删除,因此再次导致有效的内存管理。
何时在字符串常量池中创建对象
将使用direct double quotes
(String s =&#34; sytax&#34;;)语法或调用intern()
将字符串添加到SCP temorarly。
当我们使用new运算符时?
尽可能避免使用字符串或从不使用字符串。