java - 字符串文字池的工作原理

标签 java string

String str = new String("Hello");

通常我在互联网上的许多文章中读到,当我们写上面的语句时会创建两个对象。在堆上创建一个 String 对象,在 Literal Pool 上创建一个字符串对象。堆对象也引用了在 Literal Pool 上创建的对象。 (如有错误,请指正。)

请注意,以上解释是根据我在网上阅读一些文章后的理解。

所以我的问题是.. 是否有任何方法可以停止在文字池中创建字符串对象。如何实现?

[请让我知道了解这个文字池的最佳链接,它是如何实现的]

最佳答案

在文字池中只有一个 内容为“Hello”的字符串。任何使用值为“Hello”的字符串常量的代码都将共享对该对象的引用。所以通常你的语句会在每次执行时创建一个 new String 对象。 String 构造函数将 (IIRC) 从传递给它的字符串引用中创建底层数据的副本,因此实际上在构造函数完成时,这两个对象将没有共同的引用资料。 (诚​​然,这是一个实现细节。当您传入的字符串引用是一个更大的 char[] 的 View 时,这是有意义的 - 调用此构造函数的一个原因是避免卡在一个大的 char[] 不必要。)

字符串池用于减少代码中因常量字符串表达式而创建的对象数量。例如:

String a = "Hello";
String b = "He" + "llo";
String c = new String(a);

boolean ab = a == b; // Guaranteed to be true
boolean ac = a == c; // Guaranteed to be false

所以 ab 指的是同一个字符串对象(来自池中),但是 c 指的是不同的对象。

关于java - 字符串文字池的工作原理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8914878/

相关文章:

java - JAXB XJC 抑制 ObjectFactory 并生成 jaxb.in​​dex

java - STS :Class 'org.springframework.jdbc.datasource.DriverManagerDataSource' not found

c++ - 如何正确替换字符串 C++ 中的字符?

java - 使用 Mongo 3 Java 驱动程序更新双数组

java - 在数据库中插入/选择 joda-time 日期类型

c - 读取字符串不起作用

C# 从嵌套的 if 语句返回结果

sql - 查找字段中的字符串

java - 在 Java 中将字符串 "10 000.00"转换为 double 时出错

java - 为什么 Java 8 没有 "myArray.stream()"函数?