字符串文字池如何工作
String str = new String("Hello");
通常,我在互联网上的许多文章中都读到,当我们编写上述语句时,会创建两个对象。 在堆上创建一个String对象,并在Literal Pool上创建一个字符串对象。 并且堆对象也引用在Literal Pool上创建的对象。 (如果错误,请更正我的陈述。)
请注意,上面的解释是根据我的理解,阅读了一些互联网上的文章。
所以我的问题是..是否有任何方法可以停止在文字池中创建字符串对象。 怎么做?
[请让我知道了解这个文字池的最佳链接,它是如何实现的]
如果我正确理解了您的问题,那么您将询问如何初始化字符串而不将其放在字符串文字池中。 只要不声明字符串文字表达式,就可以避免这种情况(不要用双引号声明一系列字符。)
// 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'});
在文字池中只有一个字符串,内容为“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
引用不同的对象。
- 如何使用DefaultEditor方法检查JSpinner字段上的手动编辑
- 不推荐使用richfaces javax.faces.el.MethodBinding替换使用
- 如何更改Castor映射以从XML输出中的元素中删除“xmlns:xsi”和“xsi:type”属性?
- 在hibernate条件查询中选择“group by”的“all columns”
- java.lang.NoClassDefFoundError:org / apache / commons / discovery / tools / DiscoverSingleton
- JDK 7更改了keytool输出
- 启用Hibernate日志记录
- Java编码样式和Emacs cc模式配置
- 在JTextArea中的列中对齐字符串