【发布时间】:2013-06-28 07:35:13
【问题描述】:
String s="hi";
String s1=new String("hi");
从内存的角度来看,s 和 s1 存储在哪里?无论是在堆内存还是堆栈中。
而s指向“hi”,s1指向hi所在的内存位置?
请帮忙?
【问题讨论】:
String s="hi";
String s1=new String("hi");
从内存的角度来看,s 和 s1 存储在哪里?无论是在堆内存还是堆栈中。
而s指向“hi”,s1指向hi所在的内存位置?
请帮忙?
【问题讨论】:
在类加载时,所有String 文字将被放入池中。当您使用new String("hi") 时,将在堆上创建一个对象。 s 和s1 是引用变量,它应该驻留在方法调用堆栈中!字符串文字“hi”将由 JVM 处理,方法是在堆上创建一个 String 对象,并从 String 池中引用它。 new 操作符仅获取字符串对象,其引用在构造函数中传递,并创建一个新对象。恰好传递给构造函数的字符串是文字。
【讨论】:
考虑关注
String s = "hi";
String s1 = new String("hi");
变量s 将引用从字符串常量池引用的字符串文字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将指向堆上的对象。
【讨论】:
"hi" 是一个字符串文字。这会在字符串常量池中创建一次。在 Java 7 中,它与其他对象在堆中,但在此之前它是在 Perm-Gen 中创建的
String s = "hi";
String s1 = new String("hi");
new String("hi") 在堆上创建一个新的 String 对象,与现有对象分开。
s 和 s1 是对两个独立对象的引用。引用本身实际上存在于堆栈中,即使它们指向堆中的对象。
【讨论】:
s 和 s1 只是对字符串的引用,因此它们将存储在堆栈中,与 s 和 s1 引用的字符串实例不同。在这种情况下,s 引用的值将被放入字符串池中,而s1 引用的值不会。为什么?因为字符串的构造函数已用于制作该字符串。只有文字被合并,即使您选择这些文字作为其他文字的连接(例如,如果您创建了 String s2 = "h" + "i" 那么 s 和 s2 将指向存储的字符串的同一个实例在字符串池中)。
但这会导致一个小陷阱:因为池化字符串指向同一个对象,所以很容易使用== 运算符而不是equals 方法来比较字符串,这很危险,因为在某些情况下@987654331 @ 与equals() 相同,但== 与equals() 方法的结果不同的地方还有很多。
【讨论】:
以上答案是正确的,但您不应该使用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" 这样的文字创建字符串时 s 对象将引用存储在字符串常量池中的字符串“hello”。
如果我们将使用像 String s = new String("hello") 这样的 New 关键字创建新字符串,那么在这种情况下会创建两个对象。 object s 引用了存储在普通堆区域中的另一个对象,该对象将引用存储在 String 常量池中的 String Hello。
更多详情请点击链接:-http://www.javatpoint.com/java-string
【讨论】: