网站首页 > java教程 正文
1. String、StringBuffer、StringBuilder
原文出自《编写高质量代码:改善 Java 程序的 151 个建议》
CharSequence 接口有三个实现类与字符串有关:String、StringBuffer、StringBuilder,虽然它们都与字符串有关,但是其处理机制是不同的。
String 类是不可改变的量,也就是创建后就不能再修改了,比如创建了一个“abc”这样的字符串对象,那么它在内存中永远都会是“abc”这样具有固定表面值的一个对象,不能被修改,即使想通过 String 提供的方法来尝试修改,也是要么创建一个新的字符串对象,要么返回自己,比如:
String str = "abc";
String str1 = str.substring(1);
StringBuffer 是一个可变字符序列,它与 String 一样,在内存中保存的都是一个有序的字符序列(char 类型的数组),不同点是 StringBuffer 对象的值是可改变的,例如:
StringBuffer sb = new StringBuffer("a");
sb.append("b");
从上面的代码可以看出 sb 的值在改变,初始化的时候是“a”,经过 append 方法后,其值变成了“ab”。可能有读者会问了,这与 String 类通过“+”连接有什么区别?例如:
String s = "a";
s = s + "b";
有区别,字符串变量 s 初始化时是“a”对象的引用,经过加号计算后,s 变量就修改为了“ab”的引用,但是初始化的“a”对象还是没有改变,只是变量 s 指向了新的引用地址。再看看 StringBuffer 的对象,它的引用地址虽不变,但值在改变。
StringBuilder 与 StringBuffer 基本相同,都是可变字符序列,不同点是:StringBuffer 是线程安全的,StringBuilder 是线程不安全的,翻翻两者的源代码,就会发现在 StringBuffer 的方法前都有 synchronized 关键字,这也是 StringBuffer 在性能上远低于 StringBuilder 的原因。
在性能方面,由于 String 类的操作都是产生新的 String 对象,而 StringBuilder 和 StringBuffer 只是一个字符数组的再扩容而已,所以 String 类的操作要远慢于 StringBuffer 和 StringBuilder。
弄清楚了三者的原理,我们就可以在不同的场景下使用不同的字符序列了:
(1)使用 String 类的场景
在字符串不经常变化的场景中可以使用 String 类,例如常量的声明、少量的变量运算等。
(2)使用 StringBuffer 类的场景
在频繁进行字符串的运算(如拼接、替换、删除等),并且运行在多线程的环境中,则可以考虑使用 StringBuffer,例如 XML 解析、HTTP 参数解析和封装等。
(3)使用 StringBuilder 类的场景
在频繁进行字符串的运算(如拼接、替换、删除等),并且运行在单线程的环境中,则可以考虑使用 StringBuilder,如 SQL 语句的拼装、JSON 封装等。
2 String,StringBuffer, StringBuilder 的区别是什么
原文地址:https://juejin.im/post/5a5d5c66f265da3e261bf46c
作者:wangchun_166
1、String 是字符串常量,而 StringBuffer 和 StringBuilder 是字符串变量。由 String 创建的字符内容是不可改变的,而由 StringBuffer 和 StringBuidler 创建的字符内容是可以改变的。
2、StringBuffer 是线程安全的,而 StringBuilder 是非线程安全的。StringBuilder 是从 JDK 5 开始,为 StringBuffer 类补充的一个单线程的等价类。我们在使用时应优先考虑使用 StringBuilder,因为它支持 StringBuffer 的所有操作,但是因为它不执行同步,不会有线程安全带来额外的系统消耗,所以速度更快。
- END -
猜你喜欢
- 2024-11-10 Spring 基于 XML 的 IOC(spring xml map)
- 2024-11-10 阿里P7大神,Java学习之路-IO流与XML,超赞分享
- 2024-11-10 如何用Ajax解析json,XML数据格式
- 2024-11-10 Python和XML(python)
- 2024-11-10 Qt开发-流方法解析XML(qt读取文件流)
- 2024-11-10 Kettle(PDI)转换中输出之XML输出详解
- 2024-11-10 Java代码审计之不安全的Java代码(java安全点有哪些)
- 2024-11-10 spring boot Mybatis Mapper.xml使用总结
- 2024-11-10 Redis基本数据结构之字符串(redis的字符串类型是怎样实现的)
- 2024-11-10 Tomcat Server.xml配置详解(tomcat service配置)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)