String、StringBuffer、stringbuilder
一、相同点
都可以存储和操作字符串,即包含多个字符的字符串数据。
二、String的使用
①、String类是不可变(fianl)的,对String类的任何改变,都是返回一个新的String类对象【属于数据类型包装类,值是不可以修改的】。
String str="abc"; String str1="def";【没有,则需要开辟新的内存空间】
String str="abc"; Srting str1="abc";【有,则将地址返回给对象即可】
String str="abc" String str1 = new String("abc");【一定开辟了新的内存空间】
内部工作流程:a.先定义一个名为str的对String类的对象引用变量:String str
b.在栈中查找有没有存放值为"abc"的地址,如果没有,则开辟一个存放字面值为"abc"的地址,接着创建一个新的String
类的对象O,并将O的字符串值指向这个地址,而且在栈中这个地址旁边记下这个引用的对象O(需要创建新对象)。
如果已经有了值为"abc"的地址,则查找对象O,并返回O的地址(不需要通过new()创建新对象)。
②、两种创建形式
String str = "abc"; 或者 String str =new String("abc");
③、使用场景
当String变量需要经常变换其值时,会在堆中创建新的对象,而且栈中的数据不会被共享。这时候应该考虑StringBuffer类,以提高效率。
三、StringBuffer的使用
①、StringBuffer是字符串变量,它的对象是可以扩充和修改的【使用sppend()方法给字符串的缓冲区追加元素】。
②、两种创建形式
StringBuffer sbf = new StringBuffer(); sbf.append("abc");
StringBuffer sbf = new StringBuffer("abc");
③、使用场景
当要求线程安全时候,使用StringBuffer。只追求效率时,使用StringBuilder。【StringBuilder效率最高】
四、StringBuilder的使用
①、StringBuilder是一个可变的字符序列。此类提供一个与 StringBuffer 兼容的 API,但不保证同步,用在字符串缓冲区被单个线程使用
的 时候(这种情况很普遍)。
②、创建方式
StringBuilder sbd = new StringBuilder(); sbd.append("abc");
StringBuilder sbd = new StringBuilder("abc");
③、使用场景
单线程的时候被使用,其处理字符串的效率最高!【但是线程不安全的!】
五、补充
a、线程安全:多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取
完,其他线程才可使用。不会出现数据不一致或者数据污染。
b、线程不安全:就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据。
六、参考资料
String:https://baike.baidu.com/item/string/5137266?fr=aladdin
StringBuffer:https://baike.baidu.com/item/StringBuffer
StringBuilder:https://baike.baidu.com/item/StringBuilder/2308464
堆与栈:https://baike.baidu.com/item/%E5%A0%86%E6%A0%88/1682032
多线程:https://baike.baidu.com/item/%E5%A4%9A%E7%BA%BF%E7%A8%8B/1190404
线程安全:https://baike.baidu.com/item/%E7%BA%BF%E7%A8%8B%E5%AE%89%E5%85%A8/9747724?fr=aladdin