为了清晰了解String类,java中最特殊的类,探索之路
2016-09-22 00:26
711 查看
为了清晰了解String类,本人做了如下测试:
String a = "c";
String b = "c";
System.out.println(a == b);//true
说明指向同一块内存空间
System.out.println(a.equals(b));//true
String c = "e";
String d = "e";
String s = a + c;
String ss = b + d;
System.out.println(s == ss);//false
变量相加开辟了新空间
System.out.println(s.equals(ss));//true
String sss = "ce";
String ssss = new String("ce");
System.out.println(ss == sss);//false
在不同的内存区域
System.out.println(ss == ssss);//false
new出来的在【堆】中
System.out.println(ss.equals(sss));//true
System.out.println(ss.equals(ssss));//true
结论:String相加后的变量在堆中,""在常量池中。
String x = "m" + "n";
String y = "m" + "n";
String xx = "mn";
System.out.println(x==xx);//true
System.out.println(x.equals(xx));//true
System.out.println(x==y);//true
说明:""这种相加不在堆中开辟空间,直接在常量池中添加。
System.out.println(x.equals(y));//true
String z = a+b+c+d;
String zz = "c"+"c"+"e"+"e";
System.out.println(z==zz);//false 说明:与上述结论不矛盾
System.out.println(z.equals(zz));//true
StringBuilder sb = new StringBuilder();
StringBuilder sb1 = new StringBuilder();
sb.append("c").append("c").append("e").append("e");
sb1.append(a).append(b).append(c).append(d);
String t = sb.toString(); //堆中
String t1 = sb1.toString();
String tt = "ccee";
System.out.println("---------------------------------");
System.out.println(t1==t);//false
字符串常量的追加和字符串变量的追加不在同一块内存
System.out.println(t1.equals(t));//true
System.out.println(tt==t);//false
字符追加后不在常量池中,应该在堆中
System.out.println(tt.equals(t));//true
String ttt = new String("ccee");
String tttt = new String("ccee");
System.out.println(ttt==tttt);//false
堆中不检查重复
System.out.println(ttt.equals(tttt));//true
System.out.println(t==ttt);//false
结论:堆中不检查数据是否重复,与实际不矛盾
System.out.println(t.equals(ttt));//true
System.out.println(z==t);//false
System.out.println(zz==t);//false
System.out.println(z.equals(t));//true
System.out.println(zz.equals(t));//true
String r = new String("c");
System.out.println(r==a);//false
System.out.println(r.equals(a));//true
String q = new String(sb);
System.out.println(q==z);//false
System.out.println(q.equals(z));//true
System.out.println(q==zz);//false
System.out.println(q.equals(zz));//true
//总结:String a = "c";String x = "m" + "n";在常量池中。
//String ssss = new String("ce");String s = a + c;在堆中。
//堆特点:不检查重复。 常量池特点:检查重复,共享数据。 栈特点:共享(检查),先进后出。
测试结论:没new的字符串在常量池中,new出来的在堆内存中,字符串直接相加在常量池中,String类型变量相加在堆内存中。
测试结果:
那么关于如下问题就很明显了:
String s="a"+"b"+"c"+"d"创建了几个对象(假设之前串池是空的)
String str = new String("abc");创建了几个对象
String
a = "a";
String b = "b";
String c = "c";
String d = "d";
String s = a+b+c+d; 这句话创建了几个对象
首先明确:字符串常量不产生对象,字符串变量相加会产生对象
String a = "c";
String b = "c";
System.out.println(a == b);//true
说明指向同一块内存空间
System.out.println(a.equals(b));//true
String c = "e";
String d = "e";
String s = a + c;
String ss = b + d;
System.out.println(s == ss);//false
变量相加开辟了新空间
System.out.println(s.equals(ss));//true
String sss = "ce";
String ssss = new String("ce");
System.out.println(ss == sss);//false
在不同的内存区域
System.out.println(ss == ssss);//false
new出来的在【堆】中
System.out.println(ss.equals(sss));//true
System.out.println(ss.equals(ssss));//true
结论:String相加后的变量在堆中,""在常量池中。
String x = "m" + "n";
String y = "m" + "n";
String xx = "mn";
System.out.println(x==xx);//true
System.out.println(x.equals(xx));//true
System.out.println(x==y);//true
说明:""这种相加不在堆中开辟空间,直接在常量池中添加。
System.out.println(x.equals(y));//true
String z = a+b+c+d;
String zz = "c"+"c"+"e"+"e";
System.out.println(z==zz);//false 说明:与上述结论不矛盾
System.out.println(z.equals(zz));//true
StringBuilder sb = new StringBuilder();
StringBuilder sb1 = new StringBuilder();
sb.append("c").append("c").append("e").append("e");
sb1.append(a).append(b).append(c).append(d);
String t = sb.toString(); //堆中
String t1 = sb1.toString();
String tt = "ccee";
System.out.println("---------------------------------");
System.out.println(t1==t);//false
字符串常量的追加和字符串变量的追加不在同一块内存
System.out.println(t1.equals(t));//true
System.out.println(tt==t);//false
字符追加后不在常量池中,应该在堆中
System.out.println(tt.equals(t));//true
String ttt = new String("ccee");
String tttt = new String("ccee");
System.out.println(ttt==tttt);//false
堆中不检查重复
System.out.println(ttt.equals(tttt));//true
System.out.println(t==ttt);//false
结论:堆中不检查数据是否重复,与实际不矛盾
System.out.println(t.equals(ttt));//true
System.out.println(z==t);//false
System.out.println(zz==t);//false
System.out.println(z.equals(t));//true
System.out.println(zz.equals(t));//true
String r = new String("c");
System.out.println(r==a);//false
System.out.println(r.equals(a));//true
String q = new String(sb);
System.out.println(q==z);//false
System.out.println(q.equals(z));//true
System.out.println(q==zz);//false
System.out.println(q.equals(zz));//true
//总结:String a = "c";String x = "m" + "n";在常量池中。
//String ssss = new String("ce");String s = a + c;在堆中。
//堆特点:不检查重复。 常量池特点:检查重复,共享数据。 栈特点:共享(检查),先进后出。
测试结论:没new的字符串在常量池中,new出来的在堆内存中,字符串直接相加在常量池中,String类型变量相加在堆内存中。
测试结果:
那么关于如下问题就很明显了:
String s="a"+"b"+"c"+"d"创建了几个对象(假设之前串池是空的)
String str = new String("abc");创建了几个对象
String
a = "a";
String b = "b";
String c = "c";
String d = "d";
String s = a+b+c+d; 这句话创建了几个对象
首先明确:字符串常量不产生对象,字符串变量相加会产生对象
相关文章推荐
- java学习之路----spring探索1----了解IOC的小例子
- Java String类深入了解
- JAVA 线程池探索之路
- 【Java安全技术探索之路系列:Java可扩展安全架构】之二:JCA(一):JCA架构介绍
- 【Java安全技术探索之路系列:Java可扩展安全架构】之五:JCE(一):JCE架构介绍
- 【Java安全技术探索之路系列:Java可扩展安全架构】之四:JCA(三):JCA编程模型
- 想要Java面试过关,不能不深刻了解String类
- 【Java安全技术探索之路系列:Java可扩展安全架构】之九:JCP(二):JCP类和接口
- 【Java 安全技术探索之路系列:J2SE安全架构】之二:安全管理器
- 【Java 安全技术探索之路系列:J2SE安全架构】之六:安全管理工具
- 【Java安全技术探索之路系列:Java可扩展安全架构】之七:JCE(三):JCE编程模型
- 关于java.lang中String类的学习:最特殊的数据类型(持续整理中......)
- JAVA--特殊的String类
- 他山之石__java中内存分配策略 & 堆和栈的比较 & String类的特殊之处
- 【Java安全技术探索之路系列:Java可扩展安全架构】之一:Java可扩展安全架构开篇
- 【Java安全技术探索之路系列:Java基础安全服务】之一:基础安全服务开篇
- 黑马程序员_java中特殊的引用类型(对第十三课String类和包装类总结)
- java学习之路----spring探索2---注解
- 【Java代码保护探索之路系列:代码加密】之一:代码加密开篇 - DES算法加解密Java类文件
- 【Java 安全技术探索之路系列:J2SE安全架构】之三:访问控制器