StringBuilder
概述:用来表示字符串的类型
-
特点
-
是一个可变的字符序列
-
该类型底层也是维护了一个字符数组,该字符数组虽然没有私有修饰,但是默认修饰在其他包中也不能直接访问。因为该类中提供了一些修改属性的方法,所以该类型定义的字符串是可变的字符串。
-
在lang包不需要导包
-
StringBuilder构造方法
- StringBuilder() :创建一个初始值为空的字符串对象
//空参创建,默认容量位16
StringBuilder st = new StringBuilder();
System.out.println(st);
- StringBuilder(int c) :创建一个初始值为空的字符串对象
//有参创建:指定容量位66
StringBuilder st1 = new StringBuilder(66);
System.out.println(st1);
- StringBuilder(String str) : 创建一个初始值为str的字符串对象
//有参创建:默认值位chenshuang 容量位chenshuang.length()+16
StringBuilder st2 = new StringBuilder("chenshuang");
System.out.println(st2);
System.out.println(st2.capacity());//26(容量为26)
StringBuilder获取长度的方法
StringBuilder对象中维护的是一个字符数组,所以可以获取字符数组的长度和元素的个数。
- capacity() :返回对象的容量
StringBuilder st2 = new StringBuilder("chenshuang");
System.out.println(st2.capacity());
//26(表示容量位26) 容量位chenshuang.length()+16
- length():返回字符串的长度
StringBuilder st2 = new StringBuilder("chenshuang");
System.out.println(st2.length());
//10
StringBuilder类型中常用的方法
增加方法:
- append(参数):在字符串基础上追加数据,可以加任何类型的数据
如果该对象中的容量不够存储追加的数据,那么该类型会自动扩容,扩容的方式为:原数组空间*2 + 2
StringBuilder st = new StringBuilder("chenshuang123456");
System.out.println(st);
st.append("-----");
System.out.println(st);
//chenshuang123456
//chenshuang123456-----
- insert(int offset, 参数) :在指定索引添加数据 【添加的索引范围:0----length】
StringBuilder st1 = new StringBuilder("chen");
st1.insert(4,"990328");
System.out.println(st1);
//chen990328
删除方法:
- delete(int start, int end) :删除从start开始到end-1结束的字符
StringBuilder st2 = new StringBuilder("chenshuang");
st2.delete(4,10);
System.out.println(st2);
//chen
- deleteCharAt(int index) :删除指定索引位置上的字符
StringBuilder st3 = new StringBuilder("chen");
st3.deleteCharAt(3);
System.out.println(st3);
//che
替换方法:
- replace(int start, int end, String str) :将指定索引范围的字符换成新的字符串
StringBuilder st4 = new StringBuilder("chenshuang");
st4.replace(4,10,"SHUANG");
System.out.println(st4);
//chenSHUANG
反转方法:
- reverse() :将字符串在本身的基础进行反转
StringBuilder st5 = new StringBuilder("chenshuang");
st5.reverse();
System.out.println(st5);
//gnauhsnehc
String类型和StringBuilder类型拼接字符串的效率问题
- 结论:
- 使用 String 类型拼接字符串效率低
- 使用 StringBuilder 类型拼接字符串效率高
- 原因:
- 因为String类型是不可变的字符串类型,所以不能在之前的数据基础上改变,只 能在底层新建一个 StringBuilder 对象来帮助拼接,拼接后再转为String对象。效率低
- 因为 StringBuilder 类型是可变的字符串类型,所以可以在之前数据基础上直接改 变,所以效率高。
String类型和StringBuilder类型的区别
-
相同点:
- 都可以定义字符串
-
不同点:
- 定义方式不同
- String类型可以通过字符串常量来定义,也可以通过new创建一个对象
- StringBuilder类型只能通过new来创建对象
- 底层数组的定义不同
- String类型底层是通过私有final的数组来定义。不可变(没有公共改值方式)
- StringBuilder类型底层是默认数组来存储。可变(有修改的方法)
- 拼接使用效率不同
- Srting类型拼接效率低
- StringBuilder拼接效率高
- 定义方式不同
【重要】StringBuilder类型和StringBuffer类型的区别
-
相同点
- 两个类型都表示可变的字符串
- 两个类型中的方法都一模一样
-
不同点
- 出现的版本不同
- StringBuilder JDK1.5版本
- StringBuffer JDK1.0版本
- 线程安全性不同
- StringBuilder是线程不安全
- StringBuffer是线程安全
- 效率不同
- StringBulider效率高
- StringBuffer效率低
- 出现的版本不同
字符串传参问题
图示:
例子:
//因为new的对象的地址不相同。
public static void main(String[] args) {
StringBuilder st = new StringBuilder("abc");
changSb(st);
System.out.println(st);
}
private static void changSb(StringBuilder st) {
st = new StringBuilder("xyz");
System.out.println(st);
}
//xyz
//abc
//因为StringBuilder类型字符串的长度可变,所以修改的是相同的地址
public static void main(String[] args) {
StringBuilder st = new StringBuilder("abc");
changSb(st);
System.out.println(st);
}
private static void changSb(StringBuilder st) {
st.replace(0,2,"CHEN");
System.out.println(st);
}
//CHENc
//CHENc
changSb(st);
System.out.println(st);
}
private static void changSb(StringBuilder st) {
st.replace(0,2,"CHEN");
System.out.println(st);
}
//CHENc
//CHENc
##