zoukankan      html  css  js  c++  java
  • [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)方法索引多了方法栈和越界检查的消耗。

  • 相关阅读:
    解决Windows2003不能自动分配移动存储设备及硬盘盘符
    Asp.net2.0工具包AjaxControlToolkit下载和安装
    VC++开发MapX
    MapXtreme 中改变feature颜色
    IIS 发布网站流程
    net 2.0下的asp.net ajax基本使用方法
    vs2005下,"回发或回调参数无效"的解决方法
    MapXtreme 2005 地图标注全攻略
    Mapxtreme符号化
    MapXtreme 使用技巧10例
  • 原文地址:https://www.cnblogs.com/liusandao/p/12324821.html
Copyright © 2011-2022 走看看