是否可变 | 效率 | 线程是否安全 | 应用场景 | |
---|---|---|---|---|
StringBuffer | 可变 | 慢 | 线程安全 | 多线程操作 |
StringBuilder | 可变 | 快 | 线程不安全 | 单线程操作 |
注意:
StringBuffer是线程安全的,而StringBuilder则没有实现线程安全功能,所以性能略高。StringBuffer类中的方法都添加了synchronized关键字,这个关键字是为线程同步机制设定的,用来保证线程安全。
二者方法类似,这里只列举StringBuffer类的方法。
append方法可以将各种类型的变量转化为字符串然后加入StringBuffer中
。
insert方法可以将各种类型的变量转化为字符串然后插入StringBuffer中
。
方法 | 方法返回类型 | 作用 |
---|---|---|
charAt(int index) | char | 返回 char在指定索引在这个序列值 |
delete(int start, int end) | StringBuffer | 删除子串索引为start到end - 1 |
deleteCharAt(int index) | StringBuffer | 删除索引为index的字符 |
indexOf(String str) | int | 返回字符串第一次出现的索引 |
indexOf(String str, int fromIndex) | char | 返回字符串第一次出现的索引,从指定的索引开始 |
replace(int start, int end, String str) | StringBuffer | 用指定的String中的字符替换此序列的子字符串中的 String |
reverse() | StringBuffer | 反转字符串 |
setCharAt(int index, char ch) | void | 指定索引处的字符设置为 ch |
toString() | String | 返回表示此顺序中的数据的字符串 |
用一个top指针始终指向栈顶,当栈为空时,top = -1
;元素入栈时,1)添加元素2)top++
;元素出栈时,先判断top >= 0保证栈不为空,1)删除元素2)top--
;实际上StringBuffer,StringBuilder,List等变长的类均能模拟栈
;好处:不用实际定义栈,节省内存空间
。1047. 删除字符串中的所有相邻重复项
对于"abba"结构,删除"bb"会导致"aa"出现需要继续删除,即相邻两项进行匹配,出现相同的就进行删除,而**匹配问题是栈的强项
**。这里使用StringBuilder模拟栈。
class Solution { public String removeDuplicates(String s) { StringBuilder res = new StringBuilder(); int top = -1; for (int i = 0; i < s.length(); i++) { char ch = s.charAt(i); if (top >= 0 && ch == res.charAt(top)) { res.deleteCharAt(top); top--; } else { res.append(ch); top++; } } return res.toString(); } }
1209. 删除字符串中的所有相邻重复项 II
这里可以使用双栈:一个栈用StringBuilder模拟,来保存字符;一个栈用于计数。
class Solution { public String removeDuplicates(String s, int k) { StringBuilder sb = new StringBuilder(); Stack<Integer> stack = new Stack<>(); int top = -1; for (int i = 0; i < s.length(); i++) { char ch = s.charAt(i); if (top >= 0 && (ch == sb.charAt(top)) && stack.peek() == k -1) { int count = k - 1; stack.pop(); while (count > 0) { sb.deleteCharAt(top); top--; count--; } } else { sb.append(ch); if (top >= 0 && (ch == sb.charAt(top)) && stack.peek() != k -1) stack.push(stack.pop() + 1); else stack.push(1); top++; } } return sb.toString(); } }