Java基础知识——String/StringBuilder/StringBuffer的区别

Java基础——String/StringBuilder/StringBuffer的区别

1. String

public final class String implements java.io.Serializable, Comparable<String>, Charsequence {
	...
	private final char[] value;
	...
}
String x = "ab";
x += "cd";

a. JDK 1.8之前,需要三块内存完成操作,一是原来的"ab"字符串内存,一是新拼接来的"cd"字符串内存,一是拷贝两个字符串拼接在一起的新的String对象的字符串的内存;

b. JDK 1.8之后,编译器会将"+"字符串拼接操作根据需要编译成StringBuilder或者StringBuffer来处理。

String内部是一个final char[]存储的,被初始化后就不能改变这个数组,对String重新赋值实质上是在heap中重新创建String对象


2. StringBuilder

public final class StringBuilder extends AbstractStringBuilder 
	implements java.io.Serializable, Charsequence {
	
}

StringBuilder的数据是存储在一个char[]中,再不断调用append或者delete方法来增加或删除字符串

StringBuilder的append方法最终调用的是父类AbstractStringBuilder的append方法
详细添加步骤见下面注释

abstract class AbstractStringBuilder implements Appendable, CharSequence {
    char[] value;
	...
	
	public AbstractStringBuilder append(String str) {
        if (str == null) // append空字串处理
            return appendNull();
        // 计算要添加的字串长度
        int len = str.length();
        // 确保char数组的容量足够,对数组扩容,
        // 实质是调用Array.copyOf把原来的字串拷贝到新的长度的char[]中
        ensureCapacityInternal(count + len);
        // 将需要append的字符串拷贝到新的value[]的末端
        str.getChars(0, len, value, count);
        // 更新char[]长度
        count += len;
        return this;
    }
}

3. StringBuffer

 public final class StringBuffer
    extends AbstractStringBuilder
    implements java.io.Serializable, CharSequence
{
	// 在toString()时做了优化,如果这个临时的数组不为空就直接使用此数组,
	// 一旦修改(增删字符)操作,都会被置空,并等下一次toString为它赋值,
	// 在未修改的情况下再次toString将提高效率
    private transient char[] toStringCache;
	...
}
  • 附:关于transient修饰符(字面意思为临时的)
    1. 被此修饰符修饰后,变量将不是对象持久化的一部分,被序列化后无法访问(即transient变量不能被序列化);
    2. 只能修饰类的成员变量和静态变量,不能修饰局部变量、方法、类,存在这种修饰的变量的类必须实现Serializable接口;
    3. transient变量不能被反序列化(很好理解,本身不能被序列化,序列化后再反序列化自然不能得到之前的值了)
    所以这个临时的变量就是在序列化前可用,序列化后,序列化再反序列化都不可用了。

StringBuffer与StringBuilder的区别是:

  • StringBuffer在创建时,自带了长度16,有初始字符串也会在字串长度基础上加16
  • StringBuffer是线程安全的,方法都是同步方法,适用于多线程共享的变量,在性能上为了保证同步会有所牺牲。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
StringStringBuilderStringBuffer之间的区别主要有以下几点: 1. 可变性: String是不可变字符串,即一旦创建就不能修改。而StringBuilderStringBuffer是可变字符串,可以随意修改其内容。 2. 线程安全性: StringBuffer是线程安全的,可以在多线程环境下使用,而StringBuilder是线程不安全的,不适用于多线程环境。这是因为StringBuffer的方法都使用了synchronized关键字来保证线程安全性,而StringBuilder没有。 3. 执行速度: 在执行速度方面,StringBuilder的性能最好,其次是StringBuffer,而String的执行速度最慢。这是因为String每次对字符串进行修改时,都会创建一个新的String对象,而StringBuilderStringBuffer则是直接在原有的对象上进行修改,避免了创建新对象的开销。 综上所述,String是不可变的字符串,StringBuilderStringBuffer是可变的字符串,StringBuilder是线程不安全的但执行速度较快,而StringBuffer是线程安全的但执行速度稍慢。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [StringStringBuilder 以及 StringBuffer区别](https://blog.csdn.net/weixin_43682323/article/details/128036953)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [String/StringBuilder/StringBuffer之间的区别](https://blog.csdn.net/weixin_33826268/article/details/92944578)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [6. String StringBuffer StringBuilder 区别](https://blog.csdn.net/qq_44791484/article/details/115363705)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值