字符串文字池如何工作

Sun*_*pta 3 java string

String str = new String("Hello");
Run Code Online (Sandbox Code Playgroud)

通常我在互联网上的许多文章中都读到,当我们编写上述语句时,会创建两个对象.在堆上创建一个String对象,并在Literal Pool上创建一个字符串对象.并且堆对象也引用在Literal Pool上创建的对象.(如果错误,请更正我的陈述.)

请注意,上面的解释是根据我的理解,阅读了一些互联网上的文章.

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

[请告诉我有关理解此文字池的最佳链接,如何实施]

Jon*_*eet 5

在文字池中只有一个字符串,内容为"Hello".使用值为"Hello"的字符串常量的任何代码都将共享对该对象的引用.所以通常你的语句每次执行时都会创建一个 String对象.该String构造函数将(IIRC)从传递给它的字符串引用创建基础数据的副本,因此实际上在构造函数完成时,这两个对象将没有共同的引用.(无可否认,这是一个实现细节.当你传入的字符串引用是一个更大的视图时,这是有意义的char[]- 调用这个构造函数的一个原因是避免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
Run Code Online (Sandbox Code Playgroud)

所以a并且b引用相同的字符串对象(来自池)但c引用不同的对象.

  • @Alex:这主要是通过经验获得的.我完全推荐阅读Josh Bloch的第二版Effective Java. (2认同)