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