Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果在字符串常量池区域中创建(或已经存在)相同的字符串文本,那么在堆中创建重复的字符串对象有什么好处?_Java_String - Fatal编程技术网

Java 如果在字符串常量池区域中创建(或已经存在)相同的字符串文本,那么在堆中创建重复的字符串对象有什么好处?

Java 如果在字符串常量池区域中创建(或已经存在)相同的字符串文本,那么在堆中创建重复的字符串对象有什么好处?,java,string,Java,String,在上面的语句中,将创建两个对象,一个作为字符串常量池中的字符串文本“my literal”,如果它不在字符串池中,另一个作为对象字符串“my literal”出现在堆区域中 Q-1我知道将字符串文本放在字符串池区域的好处,但我无法想到在堆中创建重复对象的好处 Q2-正如我在一些stack over flow链接中读到的:如果使用new Stringmy literal几乎总是不好的,因为您将创建两个字符串,一个在字符串常量池上,另一个在具有相同值的堆上,那么我的问题是为什么Java会在堆中创建重

在上面的语句中,将创建两个对象,一个作为字符串常量池中的字符串文本“my literal”,如果它不在字符串池中,另一个作为对象字符串“my literal”出现在堆区域中

Q-1我知道将字符串文本放在字符串池区域的好处,但我无法想到在堆中创建重复对象的好处


Q2-正如我在一些stack over flow链接中读到的:如果使用new Stringmy literal几乎总是不好的,因为您将创建两个字符串,一个在字符串常量池上,另一个在具有相同值的堆上,那么我的问题是为什么Java会在堆中创建重复的对象?为什么java不忽略在堆中创建呢?

使用文本字符串调用StringString构造函数几乎没有任何好处。使用不同的字符串表达式调用StringString构造函数过去有很大的好处

文本已经是字符串,字符串对象是不可变的。更一般地说,对于传递给StringString构造函数的任何字符串表达式,构造函数通常是不必要的,因为参数已经是不可变字符串

从StringString构造函数文档中:

公共字符串原件

初始化新创建的字符串对象,使其表示与参数相同的字符序列;换句话说,新创建的字符串是参数字符串的副本。除非需要原始的显式副本,否则不需要使用此构造函数,因为字符串是不可变的

对于1.7.006之前的旧版本Java,StringString构造函数更有用。由String.substring创建的字符串可以引用较大的原始字符串,并防止其被垃圾收集。StringString构造函数切断与较大字符串的连接

你问:

问题1:。。。在堆中创建重复对象的好处是什么

通常没有。但是,如果在对象标识很重要的上下文中使用字符串对象,则可能需要另一个对象。例如:

您正在使用字符串对象作为IdentityHashMap中的键,并且只希望您自己的字符串对象匹配。 您希望对外部代码提供的字符串值进行同步。您不希望任何其他代码在同一字符串对象上同步;这可能会导致意外的干扰和死锁。[此示例由@biziclop在下面的评论中提供。] 问题2:。。。为什么Java在堆中创建重复的对象


因为你明确要求它使用新的Stringmy literal。如果使用new运算符,则会得到一个新对象。

使用文本字符串调用StringString构造函数几乎没有任何好处。使用不同的字符串表达式调用StringString构造函数过去有很大的好处

文本已经是字符串,字符串对象是不可变的。更一般地说,对于传递给StringString构造函数的任何字符串表达式,构造函数通常是不必要的,因为参数已经是不可变字符串

从StringString构造函数文档中:

公共字符串原件

初始化新创建的字符串对象,使其表示与参数相同的字符序列;换句话说,新创建的字符串是参数字符串的副本。除非需要原始的显式副本,否则不需要使用此构造函数,因为字符串是不可变的

对于1.7.006之前的旧版本Java,StringString构造函数更有用。由String.substring创建的字符串可以引用较大的原始字符串,并防止其被垃圾收集。StringString构造函数切断与较大字符串的连接

你问:

问题1:。。。在堆中创建重复对象的好处是什么

通常没有。但是,如果在对象标识很重要的上下文中使用字符串对象,则可能需要另一个对象。例如:

您正在使用字符串对象作为IdentityHashMap中的键,并且只希望您自己的字符串对象匹配。 您希望对外部代码提供的字符串值进行同步。您不希望任何其他代码在同一字符串对象上同步;这可能会导致意外的干扰和死锁。[此示例由@biziclop在下面的评论中提供。] 问题2:。。。为什么Java在堆中创建重复的对象


因为你明确要求它使用新的Stringmy literal。如果您使用new运算符,您将获得一个新对象。

@Sotirios虽然它看起来可能重复,但实际上并不重复,但提供的链接没有回答我关于在堆中创建重复对象的好处的问题?如果您向下滚动到
,您会注意到javadoc中的这句话:除非需要一个original的显式副本,否则不需要使用这个构造函数,因为字符串是不可变的。感谢Sotirios,但在这种情况下为什么Java会在堆中创建重复的对象呢?为什么java不忽略在堆中创建对象,因为它已经存在于池中?因为您显式使用了new。@AmarnatPatel为什么您认为有两个对象,当您调用str.intern时,该值只会添加到常量池中,否则不会添加到常量池中。@Sotirios虽然它看起来可能重复,但实际上并不重复,提供的链接没有回答我关于在堆中创建重复对象的好处的问题?如果向下滚动到,您会注意到javadoc中的这句话:除非需要原始对象的显式副本,否则不需要使用此构造函数,因为字符串是不可变的。感谢Sotirios,但在这种情况下为什么Java会在堆中创建重复的对象呢?为什么java不忽略在堆中创建对象,因为它已经存在于池中?因为您显式使用了new。@AmanathPatel为什么您认为有两个对象,当您调用str.intern时,该值只会添加到常量池中,否则不会。我想您指的是IdentityHashMap。你对他们问题的回答会在重复的帖子中重复。你应该把答案写在那里。谢谢,我是认真的。我查看了您引用的帖子,并搜索了其他现有的副本,但没有看到这个问题的答案。另一个影响对象标识的领域是同步。虽然在一些外部代码传递给您的字符串上进行同步是非常愚蠢的,但是创建一个副本可以确保没有干扰。@biziclop-一个很好的例子。我把它添加到上面的答案中,带有属性。谢谢我想你指的是身份地图。你对他们问题的回答会在重复的帖子中重复。你应该把答案写在那里。谢谢,我是认真的。我查看了您引用的帖子,并搜索了其他现有的副本,但没有看到这个问题的答案。另一个影响对象标识的领域是同步。虽然在一些外部代码传递给您的字符串上进行同步是非常愚蠢的,但是创建一个副本可以确保没有干扰。@biziclop-一个很好的例子。我把它添加到上面的答案中,带有属性。谢谢
String str = new String(“my literal”);