Java 之String的內存分析拼接,聯繫

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();

}


}








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章