Java字符串中的内存分配

时间:2011-02-11 17:16:49

标签: java

如果

String x = "abc";
 String y = "abc";

x和y的内存分配是什么?

5 个答案:

答案 0 :(得分:7)

这两个变量将占用参考所需的空间。

两个引用都具有相同的值 - 也就是说,它们将引用同一个对象 - 由于字符串文字的实习。换句话说,只有一个String对象。但是很多时候你执行这段代码(至少在同一个类加载器中),xy的值总是引用同一个对象。

当然,这两个变量仍然是独立的 - 你可以在不改变另一个的情况下改变一个:

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