开发者社区> 欢少的成长之路> 正文

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


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
如何设置阿里云服务器安全组?阿里云安全组规则详细解说
阿里云安全组设置详细图文教程(收藏起来) 阿里云服务器安全组设置规则分享,阿里云服务器安全组如何放行端口设置教程。阿里云会要求客户设置安全组,如果不设置,阿里云会指定默认的安全组。那么,这个安全组是什么呢?顾名思义,就是为了服务器安全设置的。安全组其实就是一个虚拟的防火墙,可以让用户从端口、IP的维度来筛选对应服务器的访问者,从而形成一个云上的安全域。
19638 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
28944 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,大概有三种登录方式:
13502 0
阿里云服务器安全组设置内网互通的方法
虽然0.0.0.0/0使用非常方便,但是发现很多同学使用它来做内网互通,这是有安全风险的,实例有可能会在经典网络被内网IP访问到。下面介绍一下四种安全的内网互联设置方法。 购买前请先:领取阿里云幸运券,有很多优惠,可到下文中领取。
22468 0
阿里云服务器ECS登录用户名是什么?系统不同默认账号也不同
阿里云服务器Windows系统默认用户名administrator,Linux镜像服务器用户名root
16297 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
20611 0
腾讯云服务器 设置ngxin + fastdfs +tomcat 开机自启动
在tomcat中新建一个可以启动的 .sh 脚本文件 /usr/local/tomcat7/bin/ export JAVA_HOME=/usr/local/java/jdk7 export PATH=$JAVA_HOME/bin/:$PATH export CLASSPATH=.
14893 0
+关注
欢少的成长之路
有物流,电商经验,RocketMQ领域专家,csdn/掘金等平台优质作者,就职于物流企业Java开发岗位
98
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载