java多线程    Java入门    vsftp    ftp    linux配置    centos    FRP教程    HBase    Html5缓存    webp    zabbix    分布式    neo4j图数据库    

String、StringBuffer和StringBuilder类的区别

String 是个final class不可变字符串,拼接性能低,频繁操作,性能影响

StringBuffer 解决大量字符串拼接,线程安全

StringBuilder 在StringBuffer基础上加个线程不安全,效率最高,优先考虑

线程安全:

StringBuffer:线程安全
StringBuilder:线程不安全

速度:

一般情况下,速度从快到慢为 StringBuilder > StringBuffer > String,当然这是相对的,不是绝对的。

使用环境:

操作少量的数据使用 String。
单线程操作大量数据使用 StringBuilder。
多线程操作大量数据使用 StringBuffer。

问题:为何String设计成不可变

1.String 不可变,所以用到字符串常量池,String s1 = 'abc'; 和 String s2 = 'abc'; 指向同一个常量池,效率更高

2.多线程安全

3.String的hashCode被缓存起来,用于HashMap这种计算hashCode的速度更快

问题:为何StringBuilder不安全

相对StringBuffer,StringBuilder没有在方法上使用 synchronized 关键字

问题:内部机制有什么不同:

简单说String的内部char数组是final 的,另外两个不是final的。

虽然String、StringBuffer和StringBuilder都是final类,它们生成的对象都是不可变的,而且它们内部也都是靠char数组实现的,但是不同之处在于,String类中定义的char数组是final的,而StringBuffer和StringBuilder都是继承自AbstractStringBuilder类,它们的内部实现都是靠这个父类完成的,而这个父类中定义的char数组只是一个普通是私有变量,可以用append追加。因为AbstractStringBuilder实现了Appendable接口。

参考资料

https://juejin.cn/post/6844903550988845063

http://c.biancheng.net/view/5822.html


This entry was posted in JAVA. Bookmark the permalink.
月小升QQ 2651044202, 技术交流QQ群 178491360
首发地址:月小升博客https://java-er.com/blog/string-stringbuffer-stringbuilder/
无特殊说明,文章均为月小升原创,欢迎转载,转载请注明本文地址,谢谢
您的评论是我写作的动力.

Leave a Reply