[转]string和stringbuffer的区别

本文详细介绍了Java中String与StringBuffer的区别,包括它们如何使用char[]实现字符串,String对象不可变性导致每次修改都需要创建新对象,而StringBuffer通过动态调整内部char[]数组大小实现高效字符串操作。

看JAVA源代码,发现了string和stringBuffer操作的区别,总结如下:
从对象实现上来说,都是通过char[]来实现的。
如果new String(),那么数组的长度为0,如果new String("String"),那么char[]数组的长度就是你创建的字符串的长度。
这个char[]在字符串创建以后是不会改变的。
如果你只对这个串本身进行查找等对字符串无改变的操作的话,对于此数组本身是没有影响的。但是如果,你要执行的是一个对此字符串本身有改变的操作的话,那么,是不可以的。
但是Strin对象为我们提供了此类操作的方法,比如concat()方法,源代码如下:
    public String concat(String s) {
        int i = s.length();
        if (i == 0) {
            return this;
        } else {
            char ac[] = new char[count + i];
            getChars(0, count, ac, 0);
            s.getChars(0, i, ac, count);
            return new String(0, count + i, ac);
        }
    }
由此,我们可以知道,其实,此方法给我们返回的已经不是当前的字符串了,而是又创建了一个新的字符串,然后返回。
其他的方法也类似。

StringBuffer的实现,也是通过char[]来实现的。但是,默认的情况下,其自己创建了一个缓存数组,长度是16,这一点,我们可以通过StringBuffer的构造器来知道:
    public StringBuffer() {
    super(16);
    }
这个方法初始化了,char[]数组的长度是16。
其父类构造器如下:
    AbstractStringBuilder(int capacity) {
        value = new char[capacity];
    }
也就是说,默认的数组长度是16。
很多的时候,容量16对于我们需要的串来说,可能远远不够。怎么办呢?
在进行串的append的时候,StringBuffer会检测剩余容量,并会重新扩充至当前容量的2倍。
    public AbstractStringBuilder append(String str) {
    if (str == null) str = "null";
        int len = str.length();
    if (len == 0) return this;
    int newCount = count + len;
    if (newCount > value.length)
        expandCapacity(newCount);
    str.getChars(0, len, value, count);
    count = newCount;
    return this;
    }

而扩容的同时,会创建一个新的数组,并将原来的数组内容复制到新的数组里面。
由此可见,如果容量不足的话,那么每一次扩容,都会耗掉大量的资源,尽管,你可能扩充的容量也很小。如果,数组的长度很大,耗掉的资源就会更多。
所以,我们在使用stringbuffer的时候,要一次在创建对象的时候给与足够多的空间,这样会提高性能。
有利必有弊,这个性能是以空间为代价。但是相对于性能的丧失来说,应该还是值得的。

如果不需要扩容的话,那么所有的操作都是基于同一个数组,那么像对于string的操作来说,不需要每一次都创建对象了,省去了创建对象的时间,性能是要好很多的,同时,String的串操作,会用去很多的空间,对于虚拟机来说,也增加了很大的压力。

## 软件功能详细介绍 1. **文本片段管理**:可以添加、编辑、删除常用文本片段,方便快速调用 2. **分组管理**:支持创建多个分组,不同类型的文本片段可以分类存储 3. **热键绑定**:为每个文本片段绑定自定义热键,实现一键粘贴 4. **窗口置顶**:支持窗口置顶功能,方便在其他应用程序上直接使用 5. **自动隐藏**:可以设置自动隐藏,减少桌面占用空间 6. **数据持久化**:所有配置文本片段会自动保存,下次启动时自动加载 ## 软件使用技巧说明 1. **快速添加文本**:在文本输入框中输入内容后,点击"添加内容"按钮即可快速添加 2. **批量管理**:可以同时编辑多个文本片段,提高管理效率 3. **热键冲突处理**:如果设置的热键与系统或其他软件冲突,会自动提示 4. **分组切换**:使用分组按钮可以快速切换不同类别的文本片段 5. **文本格式化**:支持在文本片段中使用换行符制表符等格式 ## 软件操作方法指南 1. **启动软件**:双击"大飞哥软件自习室——快捷粘贴工具.exe"文件即可启动 2. **添加文本片段**: - 在主界面的文本输入框中输入要保存的内容 - 点击"添加内容"按钮 - 在弹出的对话框中设置热键分组 - 点击"确定"保存 3. **使用热键粘贴**: - 确保软件处于运行状态 - 在需要粘贴的位置按下设置的热键 - 文本片段会自动粘贴到当前位置 4. **编辑文本片段**: - 选中要编辑的文本片段 - 点击"编辑"按钮 - 修改内容或热键设置 - 点击"确定"保存修改 5. **删除文本片段**: - 选中要删除的文本片段 - 点击"删除"按钮 - 在确认对话框中点击"确定"即可删除
### Java 中 `String` `StringBuffer` 的换方法 #### 将 `String` 换为 `StringBuffer` 可以通过创建一个新的 `StringBuffer` 对象并传入一个 `String` 参数来完成此操作。这将把给定的字符串初始化到新的 `StringBuffer` 实例中。 ```java // 创建一个 String 变量 String str = "这是一个测试"; // 使用构造函数将 String 换成 StringBuffer StringBuffer stringBuffer = new StringBuffer(str); ``` 上述代码展示了如何通过传递一个现有的 `String` 给 `StringBuffer` 构造器来进行两者间的换[^1]。 #### 将 `StringBuffer` 换回 `String` 当需要从 `StringBuffer` 返回至不可变的 `String` 类型时,可调用 `toString()` 方法: ```java // 声明并初始化一个 StringBuffer 对象 StringBuffer sb = new StringBuffer("这是另一个测试"); // 把 StringBuffer 化成 String String resultStr = sb.toString(); ``` 这里说明了怎样利用 `toString()` 函数轻松地将 `StringBuffer` 变为普通的 `String` 形式[^2]。 另外,在某些情况下也可以直接使用带有 `StringBuffer` 参数的 `String` 构造器: ```java // 同样声明并初始化一个 StringBuffer 对象 StringBuffer anotherSb = new StringBuffer("再次尝试"); // 利用 String 构造器进行String finalResult = new String(anotherSb); ``` 这段例子进一步证实了除了 `toString()` 外还有其他方式能够实现相同目的。 值得注意的是,虽然这两种数据结构都可以用来处理字符序列,但是它们有着不同的特性——特别是关于线程安全性方面的问题。`StringBuffer` 是同步化的(即支持多线程),而 `String` 不具备这样的功能;因此对于那些可能被多个线程访问的应用场景来说,应该优先考虑采用前者。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值