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
String 关于字符串的问题_String_Object - Fatal编程技术网

String 关于字符串的问题

String 关于字符串的问题,string,object,String,Object,我有两种说法: String aStr = new String("ABC"); String bStr = "ABC"; 我在书中读到,在第一条语句中,JVM创建了两个对象和一个引用变量,而第二条语句创建了一个引用变量和一个对象 怎么样?当我说newstring(“ABC”)时,很明显对象是被创建的。 现在我的问题是,对于“ABC”值,我们是否创建另一个对象 请在这里再澄清一点 谢谢使用字符串文字将只在JVM的生命周期内创建一个对象,或者可能创建类加载器。(我记不起确切的细节,但这几乎不重要

我有两种说法:

String aStr = new String("ABC");
String bStr = "ABC";
我在书中读到,在第一条语句中,JVM创建了两个对象和一个引用变量,而第二条语句创建了一个引用变量和一个对象

怎么样?当我说newstring(“ABC”)时,很明显对象是被创建的。 现在我的问题是,对于“ABC”值,我们是否创建另一个对象

请在这里再澄清一点


谢谢

使用字符串文字将只在JVM的生命周期内创建一个对象,或者可能创建类加载器。(我记不起确切的细节,但这几乎不重要。)

这意味着很难说代码示例中的第二条语句真的“创建”了一个对象——某个对象必须存在,但是如果在循环中运行相同的代码100次,它将不会创建更多的对象。。。而第一句话会。(它需要“ABC”文本引用的对象存在,并通过调用构造函数在每次迭代中创建一个新实例。)

特别是,如果您有:

Object x = "ABC";
Object y = "ABC";
然后(通过语言规范)保证
x
y
将引用相同的对象。这也扩展到与同一字符串相同的其他常量表达式:

private static final String A = "a";

Object z = A + "BC"; // x, y and z are still the same reference...
我唯一一次使用
String(String)
构造函数是如果我有一个字符串,它很可能由一个更大的字符数组支持,我不需要这个数组:

String x = readSomeVeryLargeString();
String y = x.substring(5, 10);
String z = new String(y); // Copies the contents

现在,如果
y
x
引用的字符串符合收集条件,但是
z
引用的字符串不符合收集条件(例如,它被传递给其他方法等),那么我们不会在内存中保存所有原始长字符串,否则,我们会这样做。

使用字符串文本只会在JVM的生命周期内创建一个对象,或者可能是类加载器。(我记不起确切的细节,但这几乎不重要。)

这意味着很难说代码示例中的第二条语句真的“创建”了一个对象——某个对象必须存在,但是如果在循环中运行相同的代码100次,它将不会创建更多的对象。。。而第一句话会。(它需要“ABC”文本引用的对象存在,并通过调用构造函数在每次迭代中创建一个新实例。)

特别是,如果您有:

Object x = "ABC";
Object y = "ABC";
然后(通过语言规范)保证
x
y
将引用相同的对象。这也扩展到与同一字符串相同的其他常量表达式:

private static final String A = "a";

Object z = A + "BC"; // x, y and z are still the same reference...
我唯一一次使用
String(String)
构造函数是如果我有一个字符串,它很可能由一个更大的字符数组支持,我不需要这个数组:

String x = readSomeVeryLargeString();
String y = x.substring(5, 10);
String z = new String(y); // Copies the contents

现在,如果
y
x
引用的字符串符合收集条件,但
z
引用的字符串不符合收集条件(例如,它被传递给其他方法等),那么我们不会在内存中保存所有原始长字符串,否则会保存所有长字符串。

您将得到两个字符串

1) 文字“ABC”,用于构造
aStr
,并分配给
bStr
。编译器确保这是同一个实例


2) 一个新构造的字符串
aStr
(因为你强迫它是新的,这实际上是非常不合理的)

你将得到两个字符串

1) 文字“ABC”,用于构造
aStr
,并分配给
bStr
。编译器确保这是同一个实例


2) 一个新构造的字符串
aStr
(因为你强迫它是新的,这真的很不合理)

@user900721:这都与你的问题有关-但我添加了另一段(第二段)来更直接地对它进行说明。@user900721:这都与你的问题有关-但我添加了另一段(第二个)更直接地说。好吧,我不同意这一点。当我们说String bStr=“ABC”时,对象被创建为字符串常量池而不是堆。这与在堆中创建的对象无关。当我们说new String(“ABC”)时,对象是在堆上创建的。现在,我的问题是如何创建两个对象?嗯,文本字符串仍然是一个对象(它很可能位于堆的permgen部分,另请参见)好的,我不同意这一点。当我们说字符串bStr=“ABC”然后将对象创建到字符串常量池而不是堆中。这与在堆中创建的对象无关。当我们说新字符串(“ABC”)时,对象是在堆上创建的。现在,我的问题是如何创建两个对象?嗯,文本字符串仍然是一个对象(它很可能位于堆的permgen部分,另请参阅)