String str = new String("Hello");
通常,我在互联网上的许多文章中读到,当我们编写上面的语句时,会创建两个对象。在堆上创建一个字符串对象,在文本池上创建一个字符串对象。堆对象也引用在文字池上创建的对象。(如果错误,请纠正我的这种说法。
请注意,上述解释是我在互联网上阅读一些文章后的理解。
所以我的问题是..有什么方法可以停止在文字池中创建字符串对象。怎么做?
[请让我知道了解这个文字池的最佳链接,它是如何实现的]
文字池中只有一个内容为"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
因此,a
和b
引用相同的字符串对象(来自池(,但c
引用不同的对象。
如果我正确理解您的问题,那么您正在询问如何在不将其放入字符串文本池的情况下初始化字符串。只要不声明字符串文本表达式(不要在双引号中声明一系列字符(,就可以避免这种情况。
// these two strings will be placed in the string literal pool
String one = "one";
String two = new String("two");
// this third string will NOT be placed in the string literal pool
String three = new String(new char[] {'t', 'h', 'r', 'e', 'e'});