Java 字符串常量池中的新字符串(";)会发生什么情况

Java 字符串常量池中的新字符串(";)会发生什么情况,java,string,Java,String,如果我创建一个字符串对象作为 String s=new String("Stackoverflow"); 将字符串对象仅在堆中创建,或者它还将在字符串常量池中创建副本 提前感谢。在本例中,您正在构造一个全新的字符串对象,该对象不会在常量池中共享。但是请注意,为了构造new String()对象,您实际上向它传递了一个String常量。该String常量位于常量池中,但是通过new创建的字符串并不指向同一个常量,即使它们具有相同的值 如果您创建了String s=“Stackoverflow”,

如果我创建一个字符串对象作为

String s=new String("Stackoverflow");
将字符串对象仅在堆中创建,或者它还将在字符串常量池中创建副本


提前感谢。

在本例中,您正在构造一个全新的字符串对象,该对象不会在常量池中共享。但是请注意,为了构造
new String()
对象,您实际上向它传递了一个
String
常量。该
String
常量位于常量池中,但是通过
new
创建的字符串并不指向同一个常量,即使它们具有相同的值


如果您创建了
String s=“Stackoverflow”
,那么s将包含对池中实例的引用,也有一些方法可以让您在创建
String
s后将其添加到池中。

在这种情况下,您正在构造一个全新的String对象,并且该对象不会在常量池中共享。但是请注意,为了构造
new String()
对象,您实际上向它传递了一个
String
常量。该
String
常量位于常量池中,但是通过
new
创建的字符串并不指向同一个常量,即使它们具有相同的值


如果您执行了
String s=“Stackoverflow”
操作,那么s将包含对池中实例的引用,并且有一些方法可以让您在创建
String
s后将其添加到池中。

据我所知,只有在调用
intern
或使用字符串文字时,您才能将字符串放入常量池中

无论何时调用
newstring(…)
都会得到一个常规的新
String
对象,而不管调用哪个构造函数重载

在您的例子中,您还确保常量池中有一个包含内容的字符串
“Stackoverflow”
,因为您使用的是字符串文字,但如果已经存在,则不会添加另一个字符串。因此,要将其拆分:

String x = "Stackoverflow"; // May or may not introduce a new string to the pool
String y = new String(x);   // Just creates a regular object
此外,调用
新字符串(…)
的结果将始终是对所有以前引用的不同引用,这与使用字符串文字不同。例如:

String a = "Stackoverflow";
String b = "Stackoverflow";

String x = new String(a);
String y = new String(a);

System.out.println(a == b); // true due to constant pooling
System.out.println(x == y); // false; different objects

最后,字符串添加到常量池的确切时间对我来说从来都不清楚,对我来说也不重要。我猜它可能是在类加载中(该类使用的所有字符串常量都会立即加载),但它可能是在每个方法的基础上加载的。使用
intern()
可以找到一个特定的实现,但它对我来说从来都不是非常重要:)

据我所知,只有在调用
intern
或使用字符串文字时,才能将字符串放入常量池

无论何时调用
newstring(…)
都会得到一个常规的新
String
对象,而不管调用哪个构造函数重载

在您的例子中,您还确保常量池中有一个包含内容的字符串
“Stackoverflow”
,因为您使用的是字符串文字,但如果已经存在,则不会添加另一个字符串。因此,要将其拆分:

String x = "Stackoverflow"; // May or may not introduce a new string to the pool
String y = new String(x);   // Just creates a regular object
此外,调用
新字符串(…)
的结果将始终是对所有以前引用的不同引用,这与使用字符串文字不同。例如:

String a = "Stackoverflow";
String b = "Stackoverflow";

String x = new String(a);
String y = new String(a);

System.out.println(a == b); // true due to constant pooling
System.out.println(x == y); // false; different objects

最后,字符串添加到常量池的确切时间对我来说从来都不清楚,对我来说也不重要。我猜它可能是在类加载中(该类使用的所有字符串常量都会立即加载),但它可能是在每个方法的基础上加载的。使用
intern()
可以找到一个特定的实现,但它对我来说从来都不是那么重要:)

新字符串是在堆中创建的,而不是在字符串池中创建的

如果要在字符串池中创建新字符串,则需要
intern()
it;i、 e

String s = new String("Stackoverflow").intern();
。。。当然,这将返回您开始使用的字符串文本对象

String s1 = "Stackoverflow";
String s2 = new String(s1);
String s3 = s2.intern();

System.out.println("s1 == s2 is " + (s1 == s2));
System.out.println("s2 == s3 is " + (s2 == s3));
System.out.println("s1 == s3 is " + (s1 == s3));
应该打印

s1 == s2 is false
s2 == s3 is false
s1 == s3 is true

要学究的话,
s
中的
String
不是由
新字符串(“StackOverflow”)
表达式创建的
String
intern()
所做的是在字符串池中查找其目标对象。如果池中已有一个字符串与正在查找的对象
相等(Object)
,则返回结果。在这种情况下,我们可以保证字符串池中已经有一个对象;i、 e.表示文本值的字符串对象。

新字符串是在堆中创建的,而不是在字符串池中创建的

如果要在字符串池中创建新字符串,则需要
intern()
it;i、 e

String s = new String("Stackoverflow").intern();
。。。当然,这将返回您开始使用的字符串文本对象

String s1 = "Stackoverflow";
String s2 = new String(s1);
String s3 = s2.intern();

System.out.println("s1 == s2 is " + (s1 == s2));
System.out.println("s2 == s3 is " + (s2 == s3));
System.out.println("s1 == s3 is " + (s1 == s3));
应该打印

s1 == s2 is false
s2 == s3 is false
s1 == s3 is true

要学究的话,
s
中的
String
不是由
新字符串(“StackOverflow”)
表达式创建的
String
intern()
所做的是在字符串池中查找其目标对象。如果池中已有一个字符串与正在查找的对象
相等(Object)
,则返回结果。在这种情况下,我们可以保证字符串池中已经有一个对象;i、 e.表示文本值的字符串对象。

将在堆中创建一个常规java对象,并将具有
s
类型的
String
。而且,字符串常量池中将有字符串文本。这两个都是不同的东西。

将在堆中创建一个常规java对象,并且将具有
s
类型的
字符串。并且,将有字符串文本