当我们使用new运算符时,究竟是在字符串常量池中创建了对象。?

时间:2016-09-08 10:10:12

标签: java string

String s = new String(“hello”); 

这里将创建两个对象,一个在堆内存中,另一个在字符串池中。

那么,intern()方法的用途是什么?字符串"hello"将在堆中以及上述语句执行后的字符串池中可用

4 个答案:

答案 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运算符时,究竟是在字符串常量池中创建了对象。?

不是。这里有很多混乱。

  1. 字符串池中的对象由编译器和类加载器创建,以响应字符串 literal 的使用,在本例中为"hello"
  2. new运算符在上创建 new 对象。
  3. 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运算符时?

尽可能避免使用字符串或从不使用字符串。