String对象的不可变性
1.String的各种方法,返回的都是一个新的String对象
2.如何实现不可变类:属性private、
final修饰类、
final修饰属性、
属性如果是引用类型的话不要修改引用指向的对象中的属性的值,方法返回时,返回复制,不要引用泄露、
final class MyString {
private final char[] value = new char[10];
private final int size;
public char[] toCharArray() {
//return value; 引用泄露
return Arrays.copyOf(valur, size);
}
}
3.大量临时对象
String s = "hello";
s = s + " ";
s = s + "woeld";
一共创建了三个对象: 临时对象
如何连接对象:
StringBuilder(新版本的)
StringBuffer(老版本) 线程安全、慢
StringBuilder sb = new StringBuilder("hello");
sb.append(" ");
sb.append("woeld");
String s = sb.toString();
利用StringBuilder,和append进行连接
但是在javac中,编译器自动将上面创建三个对象的案例转化为StringBuilder(通过反编译javap实现)
4.特殊点----常量池
那些对象会入池
String s = "hello"
String p = "hello world";
String s = new String("abc");//指向的对象不在池中
String p = s.intern();
//检查池中是否有equals("abc")的对象
//如果有,直接返回池中对象的引用
//如果没有,往池中放一个"hello"的对象,返回池中的对象
JVM的内存划分多了一个:
栈区、堆区、方法区、常量池区(在堆区或者方法区中)