景点介绍网站模板,宁波做网站优化多少钱,wordpress 安全插件,公司网站怎样维护运营回答重点
他们都是Java中处理字符串的类#xff0c;区别主要体现在可变性、线程安全和性能上
1#xff09;String
不可变#xff1a;String是不可变类#xff0c;字符串对象创建#xff0c;存储在堆中#xff0c;字符串内容存储在字符串常量池中#xff0c;一旦创建内…回答重点
他们都是Java中处理字符串的类区别主要体现在可变性、线程安全和性能上
1String
不可变String是不可变类字符串对象创建存储在堆中字符串内容存储在字符串常量池中一旦创建内容无法更改。每次对String进行修改操作如拼接、截取等都会创建新的字符串常量池对象适合场景String适合于字符串内容不会频繁变化的场景
2StringBuffer
可变StringBuffer是可变的因为底层是字符数组字符是局部变量存栈上跟着方法一起的生命周期如果是成员变量存在堆中跟着对象任何操作都是对数组操作而不是创建新的对象可以进行字符串的追加、删除、插入等操作线程安全StringBuffer是线程安全的内部使用了synchronized关键字保证多线程环境下的安全性适合场景适用于多线程环境中需要频繁修改字符串的场景
3StringBuilder
可变也是可变的提供了与StringBuffer类似的操作方法非线程安全线程不安全性能由于少了同步的操作性能开销比StringBuffer小适合场景适用于单线程环境中需要大量修改字符串的场景 可以看我的另一篇博客【Java】StringBuilder类和StringBuffer类的简单教程-CSDN博客
扩展知识
Java8中的优化
在Java8以后编辑器会对字符串的常量拼接做优化将字符串拼接转换为StringBuilder操作。种优化提高了代码性能但是在动态拼接或多线程场景下手动使用StringBuilder 和 StringBuffer 仍然更合适。
从演进角度看待三者 String 是Java 中基础且重要的类并且String 也是Immutable 类的典型实现被声明为finalclass除了hash 这个属性其它属性都声明为final。 因为它的不可变性所以例如拼接字符串时候会产生很多无用的中间对象如果频繁的进行这样的操作对性能有所景响。 StringBuffer就是为了解决大量拼接字符串时产生很多中间对象问题而提供的一个类提供append和insert方法可以将字符串添加到已有序列的末尾或指定位置。 它的本质是一个线程安全的可修改的字符序列把所有修改数据的方法都加上了synchronized。但是保证了线程安全是需要性能的代价的。 在很多情况下我们的字符串拼接操作不需要线程安全这时候StringBuilder 登场了StringBuilder 是JDK1.5 发布的它和StringBuffer本质上没什么区别就是去掉了保证线程安全的那部分减少了开销。 StringBuffer 和 StringBuilder 二者都继承了 Abst ractStringBuilder底层都是利用可修改的 char 数组(JDK 9以后是byte 数组)。 所以如果我们有大量的字符串拼接如果能预知大小的话最好在new StringBuffer 或者StringBuilder 的时候设置好capacity避免多次扩容的开销扩容要抛弃原有数组还要进行数组拷贝创建新的数组。