String,StringBuilder,StringBuffer区别,竟有这么多不同

举报
知识浅谈 发表于 2022/09/19 09:40:12 2022/09/19
【摘要】 String,StringBuilder,StringBuffer区别,竟有这么多不同

在这里插入图片描述

🍁 作者:知识浅谈,CSDN博客专家,阿里云签约博主,InfoQ签约博主,华为云云享专家
📌 擅长领域:全栈工程师、爬虫、ACM算法
💒 公众号:知识浅谈

从源代码看String,StringBuilder,StringBuffer区别
🤞这次以JDK1.8的版本,Jdk1.8以上底层数组采用了byte🤞

正菜来了⛳⛳⛳

🎈区别一:安全相关

  • String 和 StringBuilder是线程不安全的;
  • StringBuffer是线程安全的。

为何?
因为StringBuffer在append,delete,等等方法上加了synchronized锁,所以就是线程安全的。
这里拿出底层实现的几个方法:

	@Override
    public synchronized int length() {
        return count;
    }
    @Override
    public synchronized int capacity() {
        return value.length;
    }
    @Override
    public synchronized void ensureCapacity(int minimumCapacity) {
        super.ensureCapacity(minimumCapacity);
    }
    @Override
    public synchronized void trimToSize() {
        super.trimToSize();
    }

🎈区别二:动态数组相关

  • String 不可动态扩容;
  • StringBuilder和StringBuffer可以动态扩容。

🏹String底层使用的是final修饰的常量数组所以其大小是不可变的。

private final char value[];

🏹StringBuilder和StringBuffer是可变的
原因:因为StringBuilder和StringBuffer都是继承了抽象类AbstractStringBuilder
AbstractStringBuilder内部使用的是字符数组非常量,也就是可变的。

char[] value;

初始化的时候默认的长度为16。

StringBuilder和StringBuffer还有一个区别:StringBuffer比StringBuilder多了一个toStringCache字段。
toStringCache:在字符串tostring之后,保存执行tostring() 方法之后的结果,当字符串改变的时候toStringCache就失效。

🎈拓展:单线程下的StringBuilder

相比于StringBuilder,StringBuffer在单线程的情况下也是加锁的,所以锁的添加与释放都需要耗费一定的时间。
由于Synchronized锁的优化,其锁的状态有偏向锁,轻量级锁,重量级锁,单线程状态下一直是一个线程持有该锁,所以一直是偏向锁,这样的话锁的添加与释放就减少了一定的时间耗费。

🍚总结

以上就是关于String,StringBuilder,StringBuffer区别,希望有所帮助。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。