String
String类的特点
1.字符串不可变:
String成员变量是private final 初始化后不可改变
String str="123"; str="abc";
这里的值打印出来后从123变成了abc,但实际上是没有改变的,这里的str只是对象的引用,并不是对象本身,引用只是存放了它所指向的对象的地址,通过地址可以访问对象,这个引用存放在Java虚拟机栈栈帧的局部变量表中。str="abc";执行之后,重新创建一个对象,str指向这个对象,原来的对象"123"在内存里面没有改变。
2.字符串效果上相当于字符数组(char[]),但是底层原理是字节数组(byte[])
创建字符串对象两种方式的区别
构造方法创建
通过new创建的字符串对象,每一次new都会申请一个内存空间,虽然内容相同,但是地址值不同。
直接复制方法创建
以""方式给出的字符串,只要字符串序列相同(顺序和大小写),无论在产能的程序代码中出现过几次,jvm都只会建立一个String对象,并在字符串池中维护。
String不可变的好处
1.多线程下的安全性
2、类加载中体现的安全性
3、使用常量池可以节省空间
StringBulider和StringBuffer
字符串变量 是可变的
StringBulider是线程非安全的 StringBuffer是线程安全的 原因是因为StringBuffer类中的办法都增加了synchronized关键字, 给这个办法增加了一个锁,用来保障线程平安。
因此单线程大量数据用StringBulilder
多线程大量数据用StringBuffer