Java 之String的内存分析拼接,联系
2016-12-26 13:18
405 查看
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:
4000
"+(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();
}
}
首先主要是通过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:
4000
"+(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();
}
}
相关文章推荐
- Java从入门到精通 - JavaString 字符串拼接,截取,查找及日期转换
- 剖析java中的String之__拼接
- (5)java 字符串 从源代码的角度聊聊java中StringBuffer、StringBuilder、String中的字符串拼接
- 从源代码的角度聊聊java中StringBuffer、StringBuilder、String中的字符串拼接
- 从源代码的角度聊聊java中StringBuffer、StringBuilder、String中的字符串拼接
- Java从入门到精通 - JavaString 字符串拼接,截取,查找及日期转换
- java String字符串转换以及拼接
- Java中string拼接,StringBuilder,StringBuffer和+
- 剖析java中的String之__拼接
- Java 中字符串拼接 String 和 StringBuilder(StringBuffer)的使用
- Java中String, StringBuffer 和 StringBuilder 三个类的区别和联系
- Java String 字符串拼接,截取,查找及日期转换
- Java中的String、StringBuffer、StringBuilder的联系
- Java中String和String Buffer两种字符串类型之间的区别和联系
- Java 如何解析由String类型拼接的XML格式
- 剖析java中的String之__拼接
- 剖析java中的String之__拼接
- java String,StringBuffer,StringBuilder区别及联系
- 从源代码的角度聊聊java中StringBuffer、StringBuilder、String中的字符串拼接
- java String字符串转换以及拼接