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_Object - Fatal编程技术网

Java 如果对象是用新运算符创建的,为什么要在字符串中插入方法?

Java 如果对象是用新运算符创建的,为什么要在字符串中插入方法?,java,string,object,Java,String,Object,我看到了许多关于使用字符串文字和新关键字创建对象的问题,如: 但这并不能澄清我的疑虑 案例1:使用字符串文字的字符串对象。 它在字符串常量池中创建一个对象,如果该对象不存在,则返回该对象的引用。该对象隐式插入 案例2:使用new()的字符串对象。 它创建了两个对象,一个在字符串常量池中,另一个在堆区域中。引用变量引用堆区域对象。对于此对象,我们需要调用intern方法将此对象显式放入字符串常量池 我的问题是,如果new()已经在字符串常量池中创建了一个对象,那么对堆区域中的对象调用intern

我看到了许多关于使用字符串文字和新关键字创建对象的问题,如:

但这并不能澄清我的疑虑

案例1:使用字符串文字的字符串对象。 它在字符串常量池中创建一个对象,如果该对象不存在,则返回该对象的引用。该对象隐式插入

案例2:使用new()的字符串对象。 它创建了两个对象,一个在字符串常量池中,另一个在堆区域中。引用变量引用堆区域对象。对于此对象,我们需要调用intern方法将此对象显式放入字符串常量池

我的问题是,如果new()已经在字符串常量池中创建了一个对象,那么对堆区域中的对象调用intern方法有什么用呢

案例2:使用new()的字符串对象。它创建两个对象,一个在字符串常量池中,另一个在堆区域中

仅当通过传递字符串文本来创建新的
String
对象时,如下所示:

String s = new String("hello");
文本
“hello”
将导致在字符串常量池中创建一个对象。
newstring
将在堆上创建一个新的
String
对象,并为文本创建对象内容的副本

您不应该像那样创建
String
对象,因为这样做是不必要的,而且效率低下

但是,当传递给构造函数的值不是字符串文字时,您希望执行新字符串(…)还有其他原因。例如,该值是从文件读取的数据

案例1:使用字符串文字的字符串对象。它在字符串常量池中创建一个对象

如果是,它不存在

错。它是存在的

否则,返回此对象的引用

它总是返回对象的引用。没有“其他”的说法

此对象是隐式插入的

不是真的。因为它是一个字符串文本,所以它已经被实习了。编译器和类加载器会注意这一点。不是新的
操作员

案例2:使用new()的字符串对象。它创建两个对象,一个在字符串常量池中

不是真的。它已经在那里了:见上图

还有一个在堆区

引用变量引用堆区域对象。对于此对象,我们需要调用intern方法将此对象显式放入字符串常量池

我的问题是new()是否已经在字符串常量池中创建了一个对象


没有。请参见上文。

您弄错了:
new
不会在字符串池中创建对象,它只在堆上创建一个对象。请检查答案:是的,我同意答案,但我的问题是对对象“s”调用intern()方法有何用如果字符串常量池中已经存在文本,则没有任何用处,您不应该这样做。您只需编写
String s=“hello”取而代之。执行类似于
strings=newstring(“hello”).intern()的操作是无用的,而且效率低下。