String str = new String(“my literal”);
在上面的语句中,将创建两个对象,一个是字符串常量池中的字符串文本“my文本”(如果它不存在于字符串池中),另一个是堆区域中的对象字符串(“my heap”)。
Q-1我知道将字符串文字放在字符串池区域的好处,但是我无法考虑在堆中创建一个重复对象的好处?
Q2-正如我在流链接堆栈中所读到的:如果使用新字符串(“我的文字”)几乎总是错误的,因为您将在字符串常量池上创建两个字符串,而在堆上创建另一个字符串的值相同,那么我的问题是为什么Java要在堆中创建重复的对象?为什么不直接忽略堆中的创建呢?
发布于 2015-11-05 09:43:39
使用文字字符串调用String(String)
构造函数几乎没有好处。用不同的字符串表达式调用String(String)
构造函数有很大的好处。
文字已经是一个字符串,字符串对象是不可变的。更普遍的是,对于传递给String( String )构造函数的任何字符串表达式,构造函数通常都是不必要的,因为参数已经是不可变的字符串。
来自String(String)构造函数文档:
public String(String original)
初始化新创建的字符串对象,使其表示与参数相同的字符序列;换句话说,新创建的字符串是参数字符串的副本。除非需要一个原始的显式副本,否则就没有必要使用这个构造函数,因为String是不可变的。
使用较早版本的Java (在1.7.0_06之前),String( String )构造函数更有用。String.substring()
创建的字符串可以引用更大的原始字符串,并防止垃圾收集。String(String)
构造函数切断了与较大字符串的联系。
你问:
Q-1:.在堆中创建重复对象的好处是什么?
通常都没有。但是,如果在对象标识重要的上下文中使用字符串对象,则可能需要一个不同的对象。例如:
IdentityHashMap
中使用String对象作为键,并且只希望您自己的字符串对象匹配。Q-2:.为什么Java要在堆中创建重复的对象?
因为您在new String("my literal")
中显式地要求了它。如果使用new
运算符,就会得到一个新对象。
https://stackoverflow.com/questions/33550922
复制相似问题