StringBuffer和StringBuilder都在java.lang包下,都继承AbstractStringBuilder。
都实现接口Serializable,CharSequence,Appendable
StringBuffer和StringBuilder都没有compareTo方法
StringBuffer和StringBuilder都有append()方法,用来拼接字符串
StringBuilder
构造方法:
- StringBuilder();
// 无参构造方法,构建一个默认长度为16个空间的对象
StringBuilder builder = new StringBuilder();
- StringBuilder(CharSequence seq);
- StringBuilder(int capacity);
// 利用给定的参数,构建一个自定义长度空间的对象
StringBuilder builder = new StringBuilder(20);
- StringBuilder(String str);
// 利用带String参数的构造方法,默认数组长度为字符长度+16
StringBuilder builder = new StringBuilder("abc");
常用方法:
- append(); 最主要的方法,频繁的拼接字符串的时候使用,性能较高
StringBuilder builder = new StringBuilder("abc");
System.out.println(builder); // abc
builder.append("ABC");
System.out.println(builder); // abcABC
- capacity(); 返回底层数组的容量。length()返回的是有效元素的个数
StringBuilder builder = new StringBuilder();
System.out.println(builder.capacity); // 16
- charAt(int index);
StringBuilder builder = new StringBuiler("abc");
System.out.println("0号位置是" + builder.charAt(0)); // 0号位置是a
System.out.println("1号位置是" + builder.charAt(1)); // 1号位置是b
- codePointAt(int index);
StringBuilder builder = new StringBuiler("abc");
System.out.println("0号位置对应的Unicode码是“ + builder.codePointAt(0)): // 0号位置对应的Unicode码是97
- substring(int start,int end); / substring(int start);
StringBuilder builder = new StringBuilder("abcdefg");
String result = builder.substring(1,4); // 返回新的字符串,不改变原字符串
System.out.println(result); // bcd
System.out.println(builder); // abcdefg
- delete(int start,int end); // 删除[start,end)的元素
StringBuilder builder = new StringBuilder("abcdefg");
builder.delete(0,3): // 改变原字符串
System.out.println(builder); // defg
- deleteCharAt(int index); // 删除指定索引index号的元素
StringBuilder builder = new StringBuilder("defg");
builder.deleteCharAt(0); // 改变原字符串
System.out.println(builder); // efg
- ensureCapacity(int minimumCapacity); // 确保底层数组容量够用。调用一次肯定够(不够会扩容)
- indexOf(String str) / indexOf(String str,int fromIndex); // 找元素出现的位置
- lastIndexOf(String str) / lastIndexOf(String str, int fromIndex);
- insert(int index,value); // 有很多重载,将给定的value插入在index位置之上(插入后,index位置就是value)
StringBuilder builder = new StringBuilder("abcdefg");
builder.insert(2,'A');
System.out.println(builder); // abAcdefg
- replace(int start,int end,String str); // [start,end) 把指定部分替换成str
StringBuilder builder = new StringBuilder("abAcdefg");
builder.replace(0,2,"ABC"); // 改变原字符串
System.out.println(builder); // ABCAcdefg
- reverse(); //反转
StringBuilder builder = new StringBuilder("ABCAcdefg");
builder.reverse(); // 改变原字符串
System.out.println(builder); // gfedcACBA
14. setCharAt(int index, char ch) ; // 改对应索引位置的char值
StringBuilder builder = new StringBuilder("abcdefg");
builder.setCharAt(0,'A'); // 改变原字符串
System.out.println(builder); // Abcdefg
- setLength(int length); // 设置字符串的有效元素个数
StringBuilder builder = new StringBuilder("Abcdefg");
builder.setLength(5); // 改变原字符串
System.out.println(builder); // Abcde
- toString(); // 将StringBuilder对象构建成一个String对象返回
StringBuilder builder = new StringBuilder("Abcde");
String value = builder.toString();
System.out.println(value); // Abcde
- trimToSize(); // 将数组中无用的容量去掉,变成length长度的数组
StringBuilder builder = new StringBuilder("Abcde");
System.out.println(builder.capacity()); // 21
builder.trimToSize();
System.out.println(builder.capacity()); // 5
StringBuilder类不一定需要,是为了避免String频繁拼接修改字符串信息的时候采用的。因为是可变数组,性能较高
常用方法
与String类不同的独有的方法
append() insert() delete() deleteCharAt() reverse()
相同(方法名相同,用法不一定一致)
length() charAt() codePointAt() indexOf() lastIndexOf() replace() substring()
相对来说没有那么常用
capacity() setLength() ensureCapacity() trimToString() setCharAt()
对于StrinbBuilder和StringBuffer的不同
StringBuffer是早期版本JDK1.0
StringBuilder是后来的版本JDK1.5
方法使用几乎一致
之所以更新,是因为在JDK1.5之后体现了多线程并发的理念,产生了线程安全问题
早期版本,线程同步 安全性比较高,但是执行效率相对较低
后期版本,线程非同步,安全性比较低,但是执行效率相对较高。
所以使用StringBuilder和StringBuffer的时候,要考虑安全性和效率的问题。
如果对安全性的要求不高,对效率要求高,可使用StringBuilder
如果对安全性的要求较高,对效率要求不高,可使用StringBuffer