String s="hi";
String s1=new String("hi");
从内存的角度来看,s 和 s1 存储在哪里?无论是在堆内存还是堆栈中。
s 指向“hi”,s1 指向 hi 所在的内存位置?
请帮忙?
考虑以下
String s = "hi";
String s1 = new String("hi");
variables
将引用从 String 常量池引用的字符串字面hi
量,如果还有更多变量,例如s2 = "hi"
, 那么s
和s2
将引用同一个对象。
String s1 = new String("hi");
这将在运行时创建一个新字符串。
在第一种情况下,所有的 strnig 文字都是在 JVM 中加载类时创建的。在秒的情况下,字符串对象是在new String()
执行时创建的。您可以在以下链接中找到有关字符串常量池的好教程
http://www.thejavageek.com/2013/06/19/the-string-constant-pool/
String s="hi";
此语句在字符串池中创建包含“hi”的字符串对象。
String s1=new String("hi");
此语句在堆内存上创建一个包含“hi”的 String 对象,并在 StringPool 上创建一个它的副本(如果 stringPool 中不包含“Hi”)。但这里,S
将指向堆上的对象。
在类加载时,所有String
文字都将放入池中。当你使用new String("hi")
一个对象时会在堆上创建。s
并且s1
是引用变量,它应该驻留在方法调用堆栈中!字符串文字“hi”将由 JVM 处理,方法是String
在堆上创建一个对象,并从String
池中引用它。运算符仅获取字符串对象,其new
引用在构造函数中传递,并创建一个新对象。恰好传递给构造函数的字符串是文字。
s
ands1
只是对字符串的引用,因此它们将存储在堆栈中,这与由s
and引用的字符串实例不同s1
。在这种情况下, s 引用的值将被放入字符串池中,而 s 引用的值s1
不会。为什么?因为字符串的构造函数已用于制作该字符串。只有文字被池化,即使您选择这些文字作为其他文字的串联(例如,如果您已创建 String s2 = "h" + "i"
thens
并将s2
指向存储在字符串池中的同一字符串实例)。
但这会导致一个小陷阱:因为池化字符串指向同一个对象,所以很容易使用==
运算符而不是方法来比较字符串,这很equals
危险,因为有些场景==
与会得到与方法不同的结果。equals()
==
equals()
"hi" 是一个字符串文字。这在字符串常量池中创建一次。在 Java 7 中,它与其他对象在堆中,但在此之前它是在 Perm-Gen 中创建的
String s = "hi";
String s1 = new String("hi");
new String("hi")
在堆上创建一个新的 String 对象,与现有对象分开。
s
并且s1
是对两个独立对象的引用。引用本身实际上存在于堆栈中,即使它们指向堆中的对象。
上面的答案是正确的,但你不应该用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)。
据我说,当我们使用像 String s="hello" 这样的文字创建字符串时,对象将引用存储在字符串常量池中的字符串“hello”。
如果我们将使用像 String s = new String("hello") 这样的 New 关键字创建新字符串,那么在这种情况下会创建两个对象。object s 引用了存储在普通堆区域中的另一个对象,该对象将引用存储在 String 常量池中的 String Hello。
欲了解更多详情,请点击链接:- http://www.javatpoint.com/java-string