Java面试之String、StringBuffer和StringBuilder的区别和原理

简介: 这个问题说实话,我是被公司老板反问过的,吃过亏的。所以专门研究了一下并且分享给不懂这块知识点的人

问题源头


这个问题说实话,我是被公司老板反问过的,吃过亏的。所以专门研究了一下并且分享给不懂这块知识点的人


代码底层


如下图所示,简单介绍一下

  • String是一个变量,它是不可变的
  • StringBuilder,StringBuffer是可变的
  • StringBuilder是线程不安全的,也就是说它的代码底层实现就是每个函数都没有加 synchronized,这就导致了线程不安全,反而效率更快
  • StringBuffer是线程安全的,也就是说它的代码底层实现久是每个函数都加了synchronized,这就导致了效率比较慢的原因
  • 上面提到了可变的与不可变的,不懂的话应该抽象不出来具体的效果,我画个图一看便知。


image.png


string 数据+=流程

string+=的流程是这样的,它不会在后面直接添加一个字符串,而是通过新开辟一个字符串的形式,然后把第一个 第二个拼凑在一起,然后把地址引用调换到最终的字符串结果地址。

对于小项目操作来说的确没啥多大区别,一旦上了规模的项目,如果还是这样写的话这就导致了,循环拼接的话导致大量的新建无用的变量对象,浪费内存空间,很容易OOMimage.png

StringBuilder,StringBuffer 数据+=就是在后面直接追加了,不会再创建变量了


总结应用


简单来说,

  • 首选效率用StringBuilder,
  • 首先安全用StringBuffer ,
  • 多并发情况下首选StringBuffer,
  • 单线程操作下首选StringBuilder,
  • 至于sting在比较多的SQL拼接或者循环拼接中是不建议使用的!
  • 还有一点比较重要的话,StringBuilder,StringBuffer 经过编辑器编译之后你会发现最后都会是一个string字符串,首选前面两个只是减少内存的无用创建


相关文章
|
7月前
|
编解码 Java 开发者
Java String类的关键方法总结
以上总结了Java `String` 类最常见和重要功能性方法。每种操作都对应着日常编程任务,并且理解每种操作如何影响及处理 `Strings` 对于任何使用 Java 的开发者来说都至关重要。
428 5
|
9月前
|
存储 SQL 缓存
Java字符串处理:String、StringBuilder与StringBuffer
本文深入解析Java中String、StringBuilder和StringBuffer的核心区别与使用场景。涵盖字符串不可变性、常量池、intern方法、可变字符串构建器的扩容机制及线程安全实现。通过性能测试对比三者差异,并提供最佳实践与高频面试问题解析,助你掌握Java字符串处理精髓。
|
10月前
|
自然语言处理 Java Apache
在Java中将String字符串转换为算术表达式并计算
具体的实现逻辑需要填写在 `Tokenizer`和 `ExpressionParser`类中,这里只提供了大概的框架。在实际实现时 `Tokenizer`应该提供分词逻辑,把输入的字符串转换成Token序列。而 `ExpressionParser`应当通过递归下降的方式依次解析
475 14
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
存储 缓存 算法
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
本文介绍了多线程环境下的几个关键概念,包括时间片、超线程、上下文切换及其影响因素,以及线程调度的两种方式——抢占式调度和协同式调度。文章还讨论了减少上下文切换次数以提高多线程程序效率的方法,如无锁并发编程、使用CAS算法等,并提出了合理的线程数量配置策略,以平衡CPU利用率和线程切换开销。
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
413 4
|
算法 Java 数据中心
探讨面试常见问题雪花算法、时钟回拨问题,java中优雅的实现方式
【10月更文挑战第2天】在大数据量系统中,分布式ID生成是一个关键问题。为了保证在分布式环境下生成的ID唯一、有序且高效,业界提出了多种解决方案,其中雪花算法(Snowflake Algorithm)是一种广泛应用的分布式ID生成算法。本文将详细介绍雪花算法的原理、实现及其处理时钟回拨问题的方法,并提供Java代码示例。
2519 2
|
XML 存储 JSON
【IO面试题 六】、 除了Java自带的序列化之外,你还了解哪些序列化工具?
除了Java自带的序列化,常见的序列化工具还包括JSON(如jackson、gson、fastjson)、Protobuf、Thrift和Avro,各具特点,适用于不同的应用场景和性能需求。