String:
String是不可变类,一旦一个String对象被创建之后,String对象的字符串序列是不可变的。
String a = "abc";
a = "bcd";
当我们对a重新赋值时,会重新new一个String对象,使a重新指向新的String对象。
StringBuffer:
StringBuffer对象是可变字符串对象,可以通过append(),insert()等方式对原有对象的字符串序列进行修改。StringBuffer对象可以通过toString()转换成String对象。
StringBuilder:
StringBuilder对象也是可变字符串对象,其使用与StringBuffer大同小异,只是StringBuffer通过将所有方法添加synchronized关键字实现了线程安全,而StringBuilder没有实现线程安全。
LeetCode每日打卡3-16
面试题 01.06. 字符串压缩
字符串压缩。利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2b1c5a3。若“压缩”后的字符串没有变短,则返回原先的字符串。你可以假设字符串中只包含大小写英文字母(a至z)。
示例1:
输入:"aabcccccaaa"
输出:"a2b1c5a3"
示例2:
输入:"abbccd"
输出:"abbccd"
解释:"abbccd"压缩后为"a1b2c2d1",比原字符串长度更长。
提示:
字符串长度在[0, 50000]范围内。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/compress-string-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
这就是个很好的例子,在此题中,因为要涉及到对字符串变量的多次修改,所以用String类型显然不合适,会占用大量内存,所以用StringBuilder会更合适。
自己写的代码有点冗长,这边放一个标准题解。
class Solution { public String compressString(String S) { if (S == null || S.length() <= 2) { return S; } StringBuilder sb = new StringBuilder().append(S.charAt(0)); int cnt = 1; for (int i = 1; i < S.length(); i++) { // 如果i与i-1相同,cnt累加 if (S.charAt(i) == S.charAt(i - 1)) { cnt++; } else { // 否则拼接上i-1的次数,从i开始重新计数 sb.append(cnt).append(S.charAt(i)); cnt = 1; } } return sb.append(cnt).length() < S.length()? sb.toString(): S; } }
作者:sweetiee
链接:https://leetcode-cn.com/problems/compress-string-lcci/solution/java-bian-li-1bian-1yan-jiu-ming-bai-by-sweetiee/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
另外这边提到,可以遍历字符串时上面的代码改成先char[] c = S.toCharArray()
再索引效率更高,通过s.charAt(i)
方法索引多了方法栈和越界检查的消耗。