2
String s="hi";
String s1=new String("hi");

从内存的角度来看,s 和 s1 存储在哪里?无论是在堆内存还是堆栈中。

s 指向“hi”,s1 指向 hi 所在的内存位置?

请帮忙?

4

7 回答 7

4

考虑以下

 String s = "hi";
 String s1 = new String("hi");

variables将引用从 String 常量池引用的字符串字面hi量,如果还有更多变量,例如s2 = "hi", 那么ss2将引用同一个对象。

String s1 = new String("hi"); 

这将在运行时创建一个新字符串。

在第一种情况下,所有的 strnig 文字都是在 JVM 中加载类时创建的。在秒的情况下,字符串对象是在new String()执行时创建的。您可以在以下链接中找到有关字符串常量池的好教程

http://www.thejavageek.com/2013/06/19/the-string-constant-pool/

于 2013-07-01T08:25:23.927 回答
2
String s="hi";

此语句在字符串池中创建包含“hi”的字符串对象。

String s1=new String("hi");

此语句在堆内存上创建一个包含“hi”的 String 对象,并在 StringPool 上创建一个它的副本(如果 stringPool 中不包含“Hi”)。但这里,S将指向堆上的对象。

于 2013-07-01T08:38:50.250 回答
1

在类加载时,所有String文字都将放入池中。当你使用new String("hi")一个对象时会在堆上创建。s并且s1是引用变量,它应该驻留在方法调用堆栈中!字符串文字“hi”将由 JVM 处理,方法是String在堆上创建一个对象,并从String池中引用它。运算符仅获取字符串对象,其new引用在构造函数中传递,并创建一个新对象。恰好传递给构造函数的字符串是文字。

于 2013-07-01T08:24:56.057 回答
0

sands1只是对字符串的引用,因此它们将存储在堆栈中,这与由sand引用的字符串实例不同s1。在这种情况下, s 引用的值将被放入字符串池中,而 s 引用的值s1不会。为什么?因为字符串的构造函数已用于制作该字符串。只有文字被池化,即使您选择这些文字作为其他文字的串联(例如,如果您已创建 String s2 = "h" + "i"thens并将s2指向存储在字符串池中的同一字符串实例)。

但这会导致一个小陷阱:因为池化字符串指向同一个对象,所以很容易使用==运算符而不是方法来比较字符串,这很equals危险,因为有些场景==与会得到与方法不同的结果。equals()==equals()

于 2013-07-01T11:00:30.437 回答
0

"hi" 是一个字符串文字。这在字符串常量池中创建一次。在 Java 7 中,它与其他对象在堆中,但在此之前它是在 Perm-Gen 中创建的

 String s = "hi";

 String s1 = new String("hi");

new String("hi")在堆上创建一个新的 String 对象,与现有对象分开。

s并且s1是对两个独立对象的引用。引用本身实际上存在于堆栈中,即使它们指向堆中的对象。

于 2013-07-01T08:43:56.800 回答
0

上面的答案是正确的,但你不应该用String *s1 = new String("hi")它来代替String s1 = new String("hi"),因为对 new 的调用将返回一个指向字符串对象的指针。我对 C++ 相当陌生。对不起,如果我错了。

PS:我使用的是 gcc 版本 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC)。

于 2014-11-20T08:02:35.197 回答
0

据我说,当我们使用像 String s="hello" 这样的文字创建字符串时,对象将引用存储在字符串常量池中的字符串“hello”。

如果我们将使用像 String s = new String("hello") 这样的 New 关键字创建新字符串,那么在这种情况下会创建两个对象。object s 引用了存储在普通堆区域中的另一个对象,该对象将引用存储在 String 常量池中的 String Hello。

欲了解更多详情,请点击链接:- http://www.javatpoint.com/java-string

于 2015-08-31T05:47:06.320 回答