文章目录
一、概览
- String是不可变的字符序列;
StringBuffer是线程安全的
,可变的字符序列;- StringBuilder是可变的字符序列。
二、StringBuffer
Java.lang.StringBuffer线程安全的可变字符序列
。一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。
三、StringBuilder
java.lang.StringBuilder一个可变的字符序列
是5.0新增的。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。两者的方法基本相同。
四、面试相关
1. String,StringBuffer,StringBuilder的区别?
- A:String是内容不可变的,而StringBuffer,StringBuilder都是内容可变的。
- B:StringBuffer是同步的,数据安全,效率低;StringBuilder是不同步的,数据不安全,效率高
2. StringBuffer和数组的区别?
- 二者都可以看出是一个容器,装其他的数据。
- 但是呢,
StringBuffer的数据最终是一个字符串数据。
- 而数组( 可以定义类型)可以
放置多种数据,但必须是同一种数据类型的。
3. String和StringBuffer分别作为参数传递
- 基本数据类型的值传递,不改变其值
- 引用数据类型的值传递,改变其值
- String类虽然是引用数据类型,但是他当作参数传递时和基本数据类型是一样的
package com.heima.stringbuffer;
public class Demo07_StringBuffer {
public static void main(String[] args) {
String s = "heima";
System.out.println(s);
//String这个类一旦被初始化就不会被改变
//change方法调用完之后就弹栈了,hemaiitcast就消失了
//所以打印的s还是heima
change(s);
System.out.println(s);
System.out.println("---------------------");
StringBuffer sb = new StringBuffer();
sb.append("heima");
System.out.println(sb);
change(sb);
System.out.println(sb);
}
public static void change(StringBuffer sb) {
sb.append("itcast");
}
public static void change(String s) {
s += "itcast";
}
}
输出结果: