如果
String x = "abc";
String y = "abc";
x和y的内存分配是什么?
答案 0 :(得分:7)
这两个变量将占用参考所需的空间。
两个引用都具有相同的值 - 也就是说,它们将引用同一个对象 - 由于字符串文字的实习。换句话说,只有一个String对象。但是很多时候你执行这段代码(至少在同一个类加载器中),x
和y
的值总是引用同一个对象。
当然,这两个变量仍然是独立的 - 你可以在不改变另一个的情况下改变一个:
String x = "abc";
String y = "abc";
x = "def";
System.out.println(y); // Still prints abc
答案 1 :(得分:1)
只有一个字符串放在String文字池中。无论你在循环中运行这两行多少次,都不会分配更多的对象。
编辑:如果你想创建更多的对象,你可以这样做。
String x = new String("abc"); // don't do this
String y = new String("xyz"); // don't do this either.
每次创建一个对象,因为你告诉它。 ;)
答案 2 :(得分:1)
这是关于Java中字符串文字的nice reference。我想你对这个引文很感兴趣:
如果
String
个对象具有相同的数据 是使用常量创建的 表达式,字符串文字,a 引用现有字符串,或者通过 明确使用intern()
方法, 他们的参考文献将是相同的。
答案 3 :(得分:0)
String x =“abc”;它将创建一个字符串对象和一个引用变量。 “abc”将进入池中,x将引用它。
答案 4 :(得分:0)
因为字符串是最常用的。因此,Java使用内存优化,并防止使用过多的内存,因此它使用字符串池内存,其中如果已经存在具有相同值的字符串对象,则使用相同字符串值创建的新对象引用将指向相同的对象。但是,如果字符串是使用“ new”创建的,则对象将在堆内存中创建,如果在字符串池中还没有相同的字符串值,则还将在字符串池中创建对象。要了解更多差异以及如何分配内存,请查看代码段。
String s1="hello"; // here s1 is string object reference, "hello" is string
// value of string object created using this statement
String s2="hello"; // s2 reference the same string object as s1 do in string
// pool area
String s3=new String("hello"); // string object created in heap memory
String s4=new String("hello"); // new string object created in heap memory
System.out.println(s1==s2); //true as both string object references point
// towards same object in string pool area
System.out.println(s3==s4); //false as both string objects reference to two
//different object having same string value in heap area
String s5="hell"+"o";
System.out.println(s1==s5); //true as s5 is a combination of two strings
String s6="hell";
String s7=s6+"o"; // when we use already initialised string object reference,
// then new object created in heap memory
System.out.println(s1==s7); //false
s6+="o"; //when we use already initialised string object reference, then new
//object created in heap memory
System.out.println(s1==s6); //false
System.out.println(s3==s6); //false as objects in heap memory are not comparable
//even if with same string value using "==" so use
//equals() function
s6="hello";
s4="hello"; // initially s4 was created using "new" so points string in heap
// area now it points towards string pool area
System.out.println(s1==s6); //true s6 is reinitialized withou using new so
//reference the string in string pool area which is
//common for all objects with same string value
System.out.println(s3==s6); //false again one object(s3) reference string object
//in heap area and s6 reference string object in
//string pool
System.out.println(s3=="hello"); // false as s3 reference string object in heap
// area so not comparable
System.out.println(s1=="hello"); // true
String s8="";
s8+="hello";
System.out.println(s1==s8); //false