StringBuilder与StringBuffer
- StringBuilder可变字符串,线程不太安全,但效率高,推荐使用。
- StringBuffer可变字符串,线程安全,但效率低,不推荐使用。
- String 是不可变字符串,根据实时情况使用,在循环当中不要使用,因为会产生好的没用的字符串。
StringBuffer和StringBuilder的方法完全一样。
String,StringBuilder要学会查看api的良好习惯,通过api学会使用常见的方法,自己利用案例来理解每个方法的具体含义。这样你会更深刻理解每个方法的使用。
StringBuilder与StringBuffer常用方法
构造函数:
StringBuilder()
public StringBuilder() {
super(16);//初始化默认为16字符
}
//super:AbstractStringBuilder
AbstractStringBuilder(int capacity) {
value = new char[capacity];
}
StringBuilder(int size)
public StringBuilder(int capacity) {
super(capacity);
}
StringBuilder(String str)
public AbstractStringBuilder append(String str) {
if (str == null)
return appendNull();
int len = str.length();
ensureCapacityInternal(count + len);
str.getChars(0, len, value, count);
count += len;
return this;
}
public StringBuilder append(String str) {
super.append(str);
return this;
}
public StringBuilder(String str) {
super(str.length() + 16);
append(str);
}
StringBuilder(CharSequence chars)
public StringBuilder(CharSequence seq) {
this(seq.length() + 16);
append(seq);
}
public AbstractStringBuilder append(CharSequence s) {
if (s == null)
return appendNull();
if (s instanceof String)
return this.append((String)s);
if (s instanceof AbstractStringBuilder)
return this.append((AbstractStringBuilder)s);
return this.append(s, 0, s.length());
}
(1)、length()和capacity()
一个StringBuffer当前长度可通过length()方法得到,而整个可分配空间通过capacity()方法得到。
(2)、ensureCapacity()
设置缓冲区的大小:
void ensureCapacity(int capacity)
(3)、setLength()
设置缓冲区的长度
void setLength(int len)
(4)、charAt()和setCharAt()
同String
(5)、getChars()
同String
(6)、append()
可把任何类型数据的字符串表示连接到调用的StringBuffer对象的末尾。
int a=42;
StringBuffer sb=new StringBuffer(40);
String s=sb.append("a=").append(a).append("!").toString();
(7)、insert()
插入字符串
- StringBuffer insert(int index,String str)
- StringBuffer insert(int index,char ch)
- StringBuffer insert(int index,Object obj)
index指定将字符串插入到StringBuffer对象中的位置的下标。
(8)、reverse()
颠倒StringBuffer对象中的字符
(9)、delete()和deleteCharAt()
删除字符
- StringBuffer delete(int startIndex,int endIndex)
- StringBuffer deleteCharAt(int loc)
(10)、replace()
替换
- StringBuffer replace(int startIndex,int endIndex,String str)
(11)、substring()
截取子串
- String substring(int startIndex)
- String substring(int startIndex,int endIndex)
public static void main(String[] args) {
StringBuilder sb = new StringBuilder("abcdefghijklmnopqrstuvwxyz");
sb.append(true).append("ABC");// append(参数)添加方法,返回值是this
System.out.println(sb);
sb.delete(3, 5);// 删除方法是[start end)这样的一个规律。
System.out.println(sb);
sb.replace(3, 5, "Hello");// 替换方法是从start 开始 end结束之间插入字符串。
System.out.println(sb);
System.out.println(sb.length());// 还有一些一看就明白的方法自己尝试一下。
}
}
面试题的回答
StringBuilder 与StringBuffer的区别,StringBuilder与String的区别。
- StringBuilder效率高,线程不安全,StringBuffer效率低,线程安全。
- String是不可变字符串,StringBuilder是可变字符串。为什么有这样的差异,可以深入源码去解析,比如String类内的 priver final char value[] 等方法的原因。
- 如果是简单的声明一个字符串没有后续过多的操作,使用String,StringBuilder均可,若后续对字符穿做频繁的添加,删除操作,或者是在循环当中动态的改变字符穿的长度应该用StringBuilder。使用String会产生多余的字符串,占用内存空间。