String s="hi";
String s1=new String("hi");
从内存角度看,s和s1存储在哪里? 无论是在堆内存还是堆栈中。
s指向" hi",而s1指向hi存在的内存位置?
请帮忙?
实际上,它是Java,堆或堆栈放置中的内存分配的重复,只能标记为字符串对象和字符串文字之间的差异的重复
考虑以下
String s ="hi";
String s1 = new String("hi");
变量s将引用从字符串常量池引用的字符串文字hi,如果还有更多变量,例如s2 ="hi",则s和s2将引用同一对象。
String s1 = new String("hi");
这将在运行时创建一个新的String。
在第一种情况下,所有的strnig文字都是在JVM中加载类时创建的
在几秒钟的情况下,执行new String()时将创建字符串对象。
您可以在以下链接中找到有关字符串常量池的很好的教程
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运算符仅采用在构造函数中传递其引用的字符串对象,并创建一个新对象。碰巧,传递给构造函数的字符串是文字。
据我说,当我们使用String s =" hello"这样的文字创建String时,
的对象将引用存储在字符串常量池中的字符串" hello"。
如果我们将使用诸如String s = new String(" hello")之类的New关键字创建新的String,则在这种情况下将创建两个对象。 object s引用了存储在普通堆区域中的另一个对象,该对象将引用存储在String常量池中的String Hello。
有关更多详细信息,请访问以下链接:-http://www.javatpoint.com/java-string
以上答案是正确的,但您不应使用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)。
s和s1只是对字符串的引用,因此与s和s1引用的字符串实例不同,它们将存储在堆栈中。在这种情况下,s所引用的值将被放入字符串池,而s1所引用的值则不会。为什么?因为使用了字符串的构造函数来制作该字符串。仅合并文字,并且即使您选择这些文字作为其他文字的串联(例如,如果已将String s2 ="h" +"i"设置为String,则s和s2将指向与存储的字符串相同的实例在字符串池中)。
但是,这会导致一些陷阱:因为池中的字符串指向同一对象,所以很容易使用==运算符而不是equals方法来比较字符串,这很危险,因为在某些情况下,==是与equals()相同,但是==的结果与equals()方法不同的地方很多。
" hi"是字符串文字。这将在字符串常量池中创建一次。在Java 7中,它与其他对象一起位于Heap中,但在此之前它是在Perm-Gen中创建的
String s ="hi";
String s1 = new String("hi");
new String("hi")在堆上创建一个新的String对象,与现有对象分开。
s和s1是对两个单独对象的引用。引用本身实际上位于堆栈上,即使它们指向堆中的对象也是如此。