带有新关键字的字符串和java中的直接赋值

时间:2013-07-01 08:23:06

标签: java string

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

在内存透视图中,s和s1存储在哪里?无论是在堆内存还是堆栈中。

并且s指向“hi”并且s1指向hi存在的存储位置?

请帮帮忙?

7 个答案:

答案 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")时,将在堆上创建对象。 ss1是引用变量,它应该驻留在方法调用堆栈中!字符串文字“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对象,与现有的对象分开。

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

答案 4 :(得分:0)

ss1只是对字符串的引用,因此它们将存储在堆栈中,与ss1引用的字符串实例不同。在这种情况下,s引用的值将放在字符串池中,而s1引用的值则不会。为什么?因为字符串的构造函数已用于创建该字符串。只汇集了文字,即使您选择这些文字作为其他文字的连接(例如,如果您创建了字符串s2 = "h" + "i",那么ss2将指向同一个实例存储在字符串池中的字符串)。

这会导致一个小陷阱:因为池化的字符串指向同一个对象,所以很有可能使用==运算符而不是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