Java中String是個很常見的類,但是由於String在內存上的分配十分混亂,大家有時候可能會搞不清楚,這些引用,對象,到底放置在了何處。如此我對Java中String的內存分配進行了一系列的實驗,最終得出了一些列結果,希望有所用處。
首先主要是通過Java中的拼接符進行的一系列的操作,看看內存到底如何分配。
在JavaAPI文檔的java.lang String類中有這樣的描述:
字符串是常量;它們的值在創建之後不能更改。字符串緩衝區支持可變的字符串。因爲 String 對象是不可變的,所以可以共享。
這也給我們啓示,String類內存的變化多端,如果要避免可以使用StringBuffer類來替代之。
實驗結果:
First
n1=?=n2+"4": false
n3=?=n4+"4": true
n5=?=n6+"4": false
n7=?=n8+"4": false
n9=?=n10+"4": true
n9=?=n10+"4": false
-----------------------------分割-------------------------------------
Second
n1=?=n2+n0:false
n3=?=n4+n0: false
n5=?=n6+n0: false
n7=?=n8+n0: false
n9=?=n10+n0: false
n11=?=n12+n0: false
-----------------------------分割-------------------------------------
Third
n1=?=n2+n00: false
n3=?=n4+n00: true
n5=?=n6+n00: false
n7=?=n8+n00: false
n9=?=n10+n00: true
n11=?=n12+n00: false
-----------------------------分割-------------------------------------
Fourth
n1=?=n2+n000: false
n3=?=n4+n000: false
n5=?=n6+n000: false
n7=?=n8+n000: false
n9=?=n10+n000: false
n11=?=n12+n000: false
-----------------------------分割-------------------------------------
Fifth
n1=?=n2+n0000: false
n3=?=n4+n0000: true
n5=?=n6+n0000: false
n7=?=n8+n0000: false
n9=?=n10+n0000: true
n11=?=n12+n0000: false
-----------------------------分割-------------------------------------
Sixth
n1=?=n2.contact(n0000): false
n3=?=n4.concat(n0000): false
n5=?=n6.concat(n0000): false
n7=?=n8.concat(n0000): false
n9=?=n10.concat(n0000): false
n11=?=n12.concat(n0000): false
-----------------------------分割-------------------------------------
Sixth
非final是否可以指向fianl的驗證: n2==n4? -> true
變化非final,卻final引用在堆空間中的內存分配的驗證: n2+n00!=n3? ->true
new出來的對象無論如何在堆空間中的驗證: n5!=n3? : -> true
在堆空間中兩次變化(new或者特殊拼接)出的變量不可能內存相同的驗證: n2+n00!=n1? -> true
空串拼接也算拼接的驗證: n2+""!=n4 ->true
-----------------------------分割-------------------------------------
The End
實驗源碼:
public class StringTest {
static String n0="4";
static final String n00="4";
static final String n000=new String ("4");
static String n7="1234";
static String n8="123";
static final String n9="1234";
static final String n10="123";
public static void main(String args []){
final String n0000="4";
String n5=new String ("1234");
String n6=new String ("123");
String n1="1234";
String n2="123";
final String n3="1234";
final String n4="123";
final String n11=new String("1234");
final String n12=new String ("123");
//Firstly
System.out.println("First");
//Test1
System.out.println("n1=?=n2+\"4\": "+(n1==(n2+"4")));
//Test2
System.out.println("n3=?=n4+\"4\": "+(n3==(n4+"4")));
//Test3
System.out.println("n5=?=n6+\"4\": "+(n5==(n6+"4")));
//Test4
System.out.println("n7=?=n8+\"4\": "+(n7==(n8+"4")));
//Test5
System.out.println("n9=?=n10+\"4\": "+(n9==(n10+"4")));
//Test6
System.out.println("n9=?=n10+\"4\": "+(n11==(n12+"4")));
System.out.println("-----------------------------分割-------------------------------------");
System.out.println();
System.out.println();
//Secondly
System.out.println("Second");
//Test1
System.out.println("n1=?=n2+n0:" +(n1==(n2+n0)));
//Test2
System.out.println("n3=?=n4+n0: "+(n3==(n4+n0)));
//Test3
System.out.println("n5=?=n6+n0: "+(n5==(n6+n0)));
//Test4
System.out.println("n7=?=n8+n0: "+(n7==(n8+n0)));
//Test5
System.out.println("n9=?=n10+n0: "+(n9==(n10+n0)));
//Test6
System.out.println("n11=?=n12+n0: "+(n11==(n12+n0)));
System.out.println("-----------------------------分割-------------------------------------");
System.out.println();
System.out.println();
//Thirdly
System.out.println("Third");
//Test1
System.out.println("n1=?=n2+n00: "+(n1==(n2+n00)));
//Test2
System.out.println("n3=?=n4+n00: "+(n3==(n4+n00)));
//Test3
System.out.println("n5=?=n6+n00: "+(n5==(n6+n00)));
//Test4
System.out.println("n7=?=n8+n00: "+(n7==(n8+n00)));
//Test5
System.out.println("n9=?=n10+n00: "+(n9==(n10+n00)));
//Test6
System.out.println("n11=?=n12+n00: "+(n11==(n12+n00)));
System.out.println("-----------------------------分割-------------------------------------");
System.out.println();
System.out.println();
//Fourthly
System.out.println("Fourth");
//Test1
System.out.println("n1=?=n2+n000: "+(n1==(n2+n000)));
//Test2
System.out.println("n3=?=n4+n000: "+(n3==(n4+n000)));
//Test3
System.out.println("n5=?=n6+n000: "+(n5==(n6+n000)));
//Test4
System.out.println("n7=?=n8+n000: "+(n7==(n8+n000)));
//Test5
System.out.println("n9=?=n10+n000: "+(n9==(n10+n000)));
//Test6
System.out.println("n11=?=n12+n000: "+(n11==(n12+n000)));
System.out.println("-----------------------------分割-------------------------------------");
System.out.println();
System.out.println();
//FIfthly
System.out.println("Fifth");
//Test1
System.out.println("n1=?=n2+n0000: "+(n1==(n2+n0000)));
//Test2
System.out.println("n3=?=n4+n0000: "+(n3==(n4+n0000)));
//Test3
System.out.println("n5=?=n6+n0000: "+(n5==(n6+n0000)));
//Test4
System.out.println("n7=?=n8+n0000: "+(n7==(n8+n0000)));
//Test5
System.out.println("n9=?=n10+n0000: "+(n9==(n10+n0000)));
//Test6
System.out.println("n11=?=n12+n0000: "+(n11==(n12+n0000)));
System.out.println("-----------------------------分割-------------------------------------");
System.out.println();
System.out.println();
//Sixthly
System.out.println("Sixth");
//Test1
System.out.println("n1=?=n2.contact(n0000): "+(n1==(n2.concat(n0000))));
//Test2
System.out.println("n3=?=n4.concat(n0000): "+(n3==(n4.concat(n0000))));
//Test3
System.out.println("n5=?=n6.concat(n0000): "+(n5==(n6.concat(n0000))));
//Test4
System.out.println("n7=?=n8.concat(n0000): "+(n7==(n8.concat(n0000))));
//Test5
System.out.println("n9=?=n10.concat(n0000): "+(n9==(n10.concat(n0000))));
//Test6
System.out.println("n11=?=n12.concat(n0000): "+(n11==(n12.concat(n0000))));
System.out.println("-----------------------------分割-------------------------------------");
System.out.println();
System.out.println();
//Sixthly
System.out.println("Sixth");
//Test1
System.out.println("非final是否可以指向fianl的驗證: n2==n4? -> "+(n2==n4));
//Test2
System.out.println("變化非final,卻final引用在堆空間中的內存分配的驗證: n2+n00!=n3? ->"+(n2+n00!=n3));
//Test3
System.out.println("new出來的對象無論如何在堆空間中的驗證: n5!=n3? : -> "+(n5!=n3));
//Test4
System.out.println("在堆空間中兩次變化(new或者特殊拼接)出的變量不可能內存相同的驗證: n2+n00!=n1? -> "+(n2+n00!=n11));
//Test5
System.out.println("空串拼接也算拼接的驗證: n2+\"\"!=n4 ->"+(n2+""!=n4));
System.out.println("-----------------------------分割-------------------------------------");
System.out.println("The End");
System.out.println();
}
}