Java 之String的内存分析拼接,联系

来源:互联网 发布:数据库是 编辑:程序博客网 时间:2024/04/20 00:09

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

}


}








0 0
原创粉丝点击