[Java]String、StringBuffer和StringBuilder的区别

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)方法索引多了方法栈和越界检查的消耗。

原文地址:https://www.cnblogs.com/liusandao/p/12324821.html