我知道有两种方法可以在Java中创建String:
String a = "aaa";
String b = new String("bbb");
第一种方式,Java肯定会在字符串池中创建一个String对象并a
引用它。(假设“aaa”之前不在游泳池里。)
如果这是真的,那么每次使用new String("bbb");
,在池中创建一个对象“bbb”,这意味着通过上面的任何一种方式,java将始终在池中创建一个字符串对象。然后intern()
用于什么?
发布于 2018-09-26 10:18:51
String
在Java编程语言中的一个不可变对象中,这意味着一旦构造就无法改变。因此,JVM能够维护文字池,这有助于减少内存使用并提高性能。每次String
使用文字时,JVM都会检查文字池,如果文字已经可用,则会返回相同的引用。如果不是,则会在文字池中创建并添加新的String对象。
当尝试创建String
类似基元或文字/常量时,将应用此理论。
String str = "bbb";
但是当你创建一个新的String对象时
String str = new String("bbb"));
覆盖上述规则并始终创建新实例。
但是,即使创建了一个using 运算符intern
,String
该类中的API 也可用于String
从literal
池中选择引用。请查看下面给出的示例。虽然使用运算符创建,因为我们使用了JVM从池中获取引用的方法。Stringnewstr3newinternliteral
public class StringInternExample {
public static void main(final String args[]) {
final String str = "bbb";
final String str1 = "bbb";
final String str2 = new String("bbb");
final String str3 = new String("bbb").intern();
System.out.println("str == str1 : "+(str == str1));
System.out.println("str == str2 : "+(str == str2));
System.out.println("str == str3 : "+(str == str3));
}
}
上述代码的输出:
str == str1 : true
str == str2 : false
str == str3 : true
发布于 2018-09-26 11:46:31
new String("abc")
将在内存中创建一个新对象,因此建议避免使用它。请查看Josh Bloch的Effective Java第5项“避免创建不必要的对象”,其中更好地解释:
作为不该做的极端例子,请考虑以下声明:
String s = new String("stringette"); // DON'T DO THIS!
该语句在每次执行时都会创建一个新的String实例,并且这些对象创建都不是必需的。String构造函数(“stringette”)的参数本身就是一个String实例,在功能上与构造函数创建的所有对象完全相同。如果这种用法发生在循环或频繁调用的方法中,则可以不必要地创建数百万个String实例。改进版只是以下内容:
String s = "stringette";
此版本使用单个String实例,而不是每次执行时都创建一个新实例。此外,保证对象将被同一虚拟机中运行的任何其他代码重用,恰好包含相同的字符串文字[JLS,3.10.5]。
https://stackoverflow.com/questions/-100002747
复制相似问题