[转]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的串操作,会用去很多的空间,对于虚拟机来说,也增加了很大的压力。

**项目名称:** 基于Vue.js与Spring Cloud架构的博客系统设计与开发——微服务分布式应用实践 **项目概述:** 本项目为计算机科学与技术专业本科毕业设计成果,旨在设计并实现一个采用前后端分离架构的现代化博客平台。系统前端基于Vue.js框架构建,提供响应式用户界面;后端采用Spring Cloud微服务架构,通过服务拆分、注册发现、配置中心及网关路由等技术,构建高可用、易扩展的分布式应用体系。项目重点探讨微服务模式下的系统设计、服务治理、数据一致性及部署运维等关键问题,体现了分布式系统在Web应用中的实践价值。 **技术架构:** 1. **前端技术栈:** Vue.js 2.x、Vue Router、Vuex、Element UI、Axios 2. **后端技术栈:** Spring Boot 2.x、Spring Cloud (Eureka/Nacos、Feign/OpenFeign、Ribbon、Hystrix、Zuul/Gateway、Config) 3. **数据存储:** MySQL 8.0(主数据存储)、Redis(缓存与会话管理) 4. **服务通信:** RESTful API、消息队列(可选RabbitMQ/Kafka) 5. **部署与运维:** Docker容器化、Jenkins持续集成、Nginx负载均衡 **核心功能模块:** - 用户管理:注册登录、权限控制、个人中心 - 文章管理:富文本编辑、分类标签、发布审核、评论互动 - 内容展示:首页推荐、分类检索、全文搜索、热门排行 - 系统管理:后台仪表盘、用户与内容监控、日志审计 - 微服务治理:服务健康检测、动态配置更新、熔断降级策略 **设计特点:** 1. **架构解耦:** 前后端完全分离,通过API网关统一接入,支持独立开发与部署。 2. **服务拆分:** 按业务域划分为用户服务、文章服务、评论服务、文件服务等独立微服务。 3. **高可用设计:** 采用服务注册发现机制,配合负载均衡与熔断器,提升系统容错能力。 4. **可扩展性:** 模块化设计支持横向扩展,配置中心实现运行时动态调整。 **项目成果:** 完成了一个具备完整博客功能、具备微服务典型特征的分布式系统原型,通过容器化部署验证了多服务协同运行的可行性,为云原生应用开发提供了实践参考。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
### 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、付费专栏及课程。

余额充值