[转]string和stringbuffer的区别

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

混合动力汽车(HEV)模型的Simscape模型(Matlab代码、Simulink仿真实现)内容概要:本文档介绍了一个混合动力汽车(HEV)的Simscape模型,该模型通过Matlab代码Simulink仿真工具实现,旨在对混合动力汽车的动力系统进行建模与仿真分析。模型涵盖了发动机、电机、电池、传动系统等关键部件,能够模拟车辆在不同工况下的能量流动与控制策略,适用于动力系统设计、能耗优化及控制算法验证等研究方向。文档还提及该资源属于一个涵盖多个科研领域的MATLAB仿真资源包,涉及电力系统、机器学习、路径规划、信号处理等多个技术方向,配套提供网盘下载链接,便于用户获取完整资源。; 适合人群:具备Matlab/Simulink使用基础的高校研究生、科研人员及从事新能源汽车系统仿真的工程技术人员。; 使用场景及目标:①开展混合动力汽车能量管理策略的研究与仿真验证;②学习基于Simscape的物理系统建模方法;③作为教学案例用于车辆工程或自动化相关课程的实践环节;④与其他优化算法(如智能优化、强化学习)结合,实现控制策略的优化设计。; 阅读建议:建议使用者先熟悉Matlab/Simulink及Simscape基础操作,结合文档中的模型结构逐步理解各模块功能,可在此基础上修改参数或替换控制算法以满足具体研究需求,同时推荐访问提供的网盘链接获取完整代码与示例文件以便深入学习与调试。
### 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` 不具备这样的功能;因此对于那些可能被多个线程访问的应用场景来说,应该优先考虑采用前者。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值