Java中字符串探索----String ,StringBuffer ,StringBuilder及字符串缓存池
字符串是编程中应用到最多的一个数据类型,简单实用,但是深入理解它们,会给我们带来更多好处。
字符串缓存池:
为了节省内存,提高资源的复用,java中引入了字符串缓存池的概念。
缓存池中的字符串是不可回收的:
在缓存池中的字符串是不会被垃圾回收机制回收的,基本都是常驻内存,所以过多食用String类,可能会出现内存溢出(下面会讲)。
怎么样才会存进缓存池:
- 直接量赋值创建对象
在Java,基本包装类型String,Long,Float,Boolean.......都可以利用直接量创建对象。
String用直接量进行创建对象的时候,会先在缓存池找到字符串相同的对象,然后指向缓存池中该对象,这样就避免了重新为该对象分配内存,从而提高了复用,所以建议多用直接量去创建对象,这个也是上篇博文所推荐的。 - 调用构造器创建对象
这种方法调用构造器,凡是new出来的对象都要进行内存分配,所以是不会指向缓存池之前已有的对象,这样就导致缓存池里面可能有多个值相同的String对象。
package biaodashi;
/**
* 字符串关于缓存池
*
* @author ccf
*
*/
public class StringHuanCunChi {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
StringHuanCunChi huanCunChi = new StringHuanCunChi();
huanCunChi.test1();
}
public void test1() {
String str1 = "ccf";
String str2 = "ccf";
String str3 = new String("ccc"); // new 会有新的地址分配,所以不会指向缓存池的"ccc"
String str4 = new String("ccc");
System.out.println("str1==str2?" + (str1 == str2));
System.out.println("str3==str4?" + (str3 == str4));
}
}
/**
* 字符串关于缓存池
*
* @author ccf
*
*/
public class StringHuanCunChi {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
StringHuanCunChi huanCunChi = new StringHuanCunChi();
huanCunChi.test1();
}
public void test1() {
String str1 = "ccf";
String str2 = "ccf";
String str3 = new String("ccc"); // new 会有新的地址分配,所以不会指向缓存池的"ccc"
String str4 = new String("ccc");
System.out.println("str1==str2?" + (str1 == str2));
System.out.println("str3==str4?" + (str3 == str4));
}
}