Java基础 |12.String、StringBuffer和StringBuilder
文章目录
- 参考文章
- 1.整体总述
- 2.String
- 3.StringBuffer和StringBuilder
-
- 3.1.整体概述
- **3.2.二者区别**
- 4.特例解析
-
- 4.1.例子与结论
- 4.2.结论分析
参考文章
String、StringBuffer与StringBuilder之间区别
1.整体总述
字符串变量 | 是否可变 | 特点 |
---|---|---|
String | 否 | |
StringBuffer | 是 | 效率低,线程安全(多线程) |
StringBuilder | 是 | 效率高,线程不安全(单线程常用) |
如果某字符串经常变动,应该使用具备可变性的StringBuffer和StringBuilder;
而StringBuilder的效率更高,因此在非多线程的情况下应优先选择。
2.String
String对象是不可变的,底层是一个由final关键字修饰的char数组:
private final char value[];
一旦定义好,之后的所谓的更改,实际上都是在生成新的对象,并重新将引用指向这个新的对象。
以拼接hello和World为例:
String str = "hello"//为"hello"分配内存str = str + "World" //为"World"分配内存,再为"helloWorld"分配内存
实现上述拼接,生成一个"helloWorld"字符串,就占用了三份内存。
3.StringBuffer和StringBuilder
3.1.整体概述
-
StringBuffer和StringBuilder类对象是可变的,内容的改变并不会产生新的对象;
-
常用于涉及拼接、删减、插入等操作时对字符串的定义。
继承关系如下图所示:
3.2.二者区别
- StringBuffer执行速度较慢,使用synchronized保证线程安全(支持多线程)
- StringBuilder执行速度更快,线程不安全(只支持单线程)
由于StringBuilder速度占优,大部分情况都应优先使用StringBuilder
4.特例解析
4.1.例子与结论
分析以下代码:
// 01.使用String实现"拼接"String str1 = "hello" + "World";// 02.使用String实现拼接String str1 = "hello";String str2 = "World";String str3 = str1 + str2;// 03.使用StringBuilder实现拼接StringBuilder sb = new StringBuilder() .append("hello") .append("World");
以上三种情况的效率比较是:
第一种 > 第三种 > 第二种
4.2.结论分析
1) 第一种其实是伪拼接,实际在执行时,JVM会认为以下两行代码等效:
String str1 = "hello" + "world";String str1 = "helloWorld";
因此JVM只会为其分配一份的内存资源,而并没有真正拼接,因此效率最快
2) 第二种则是真正的拼接了,执行时JVM会分配三份内存资源,因此效率最差
3) 第三种是使用StringBuilder拼接,JVM会为其分配一份内存资源,数值相同的情况下,StringBuilder相比String消耗的资源会更多一些。