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字符串,首选前面两个只是减少内存的无用创建


相关文章
|
2月前
|
算法 Java
50道java集合面试题
50道 java 集合面试题
|
4月前
|
Java 数据库连接 数据库
Java 相关知识点总结含基础语法进阶技巧及面试重点知识
本文全面总结了Java核心知识点,涵盖基础语法、面向对象、集合框架、并发编程、网络编程及主流框架如Spring生态、MyBatis等,结合JVM原理与性能优化技巧,并通过一个学生信息管理系统的实战案例,帮助你快速掌握Java开发技能,适合Java学习与面试准备。
202 2
Java 相关知识点总结含基础语法进阶技巧及面试重点知识
|
2月前
|
算法 Java
50道java基础面试题
50道java基础面试题
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
12月前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
12月前
|
存储 缓存 算法
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
本文介绍了多线程环境下的几个关键概念,包括时间片、超线程、上下文切换及其影响因素,以及线程调度的两种方式——抢占式调度和协同式调度。文章还讨论了减少上下文切换次数以提高多线程程序效率的方法,如无锁并发编程、使用CAS算法等,并提出了合理的线程数量配置策略,以平衡CPU利用率和线程切换开销。
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
299 4
|
算法 Java 数据中心
探讨面试常见问题雪花算法、时钟回拨问题,java中优雅的实现方式
【10月更文挑战第2天】在大数据量系统中,分布式ID生成是一个关键问题。为了保证在分布式环境下生成的ID唯一、有序且高效,业界提出了多种解决方案,其中雪花算法(Snowflake Algorithm)是一种广泛应用的分布式ID生成算法。本文将详细介绍雪花算法的原理、实现及其处理时钟回拨问题的方法,并提供Java代码示例。
1783 2