1String
1.1String字符串常量
- String只有常量没有变量
String的值放在String常量池中,并且不会被JVM释放
上栗子:
String str1 = new String("abc");
String str2 = new String("abc");
System.out.println(str1==str2); //false
System.out.println(str1.equals(str2)); //true
String str3 = "abc";
String str4 = "abc";
System.out.println(str3==str4); //true
System.out.println(str3.equals(str4)); //true
输出结果是:
false
true
true
true
疑问:str1==str2是false,而str3==str4就为true。(前者是比较引用(用了new),后者是赋值比较)。
str1.equals(str2)为true。(equals是比较引用的值)(其实equals和==本质上没区别,只是String重写了equals方法)
看内存模型解析:
解析:
str1和str2都是new出来的,所以str1和str2分别指向堆中的内存块。但注意的是String值不是在堆中的,而是在String常量池中,所以说String是常量字符串。
并且它的值是不会被释放的,而是一直停留在常量池中(就算是没有被引用夜不会被释放),例如:
String str1 = "abc";
str1 = "dfg";
str1 = "ttt";
看内存:只画String常量池
执行完语句后str1最终指向了ttt,但其它的abc,dfg都还会存在内存中,不会被JVM回收。
2Stringbuffer和StringBuilder
其实这两个类都差不多,只不过一个线程安全(StringBuffer),一个线程不安全(StringBuilder),一般来说String类不会晕倒线程不安问题,建议使用StringBuilder(线程不安的速度快)
因为String是字符串,所在拼接字符串操作会产生大量内存,StringBuilder就能很好的解决这个问题
看栗子:
这段代码会拼接100次字符串就会有100块内存,但是有用的只有最后一块
String str = "";
for(int i=0;i<100;i++){
//拼接字符串,这就要拼接100次
str = str+i;
}
System.out.println(str);//输出结果是:01234.......99
看内存:只画了String常量池
所以就需要用StringBuilder来解决这个问题。
上栗子:
//实例化Stb
StringBuilder stb = new StringBuilder("");
for(int i=0;i<100;i++){
//用append()方法拼接
stb.append(i);
}
System.out.println(stb);//输出结果是:01234.......99
所以建议在做拼接字符串处理的是用StringBUilder