它们到底都有什么区别呢!

三者都是用来对字符串进行操作,String通常用来定义一个变量,而StringBuilder StringBuffer则通常用来对字符串进行拼接等操作。但其实String同样的可以用来拼接字符串,可我们为什么很少使用呢,这样从三者的底层代码说起。

String的底层代码为一个用final修饰的char数组,这意味着定义一个String变量以后,该变量的内容是不可变的。

StringBuilder 与StringBuffer都继承自AbstractStringBuilder,该类的char数组并没有用final修饰,内容是可变的,这个是什么意思呢。

比如:

String s1= "a";

String s2 = new String("b") ;

String s3 = s1+s2;

如果这样,我们得到“ab”这个字符串,因为String底层未不可变的字符串,所以会创建三个对象,都会占用内存,而这三个对象一直都未失去引用,所以jvm无法垃圾回收,造成内存资源的大量浪费,这在我们开发中是不推崇的,而StringBuilder 与StringBuffer则不存在这样的问题。

通过底层代码我们可以看到StringBuilder 与StringBuffer在拼接字符串时,通过判断字符串长度是否足够,从而创建一个新的数组用来封装数据,而原来的对象被放弃引用,等待垃圾回收,从而减少内存的浪费,因此在拼接字符串等操作时,我们通常使用StringBuilder 与StringBuffer,但两者在执行效率上又有不同,StringBuilder的执行效率较高,这是为什么呢?

通过底层源码,可以发现StringBuffer在拼接字符串时,使用了同步锁,安全性提高,而StringBuilder未使用同步锁,故效率提高。

最新文章

  1. PDF编辑神器
  2. make menuconfig出错解决方法
  3. 【原创】有关Silverlight DataGrid双击事件的分析 完整分析 代码与示例
  4. 1009 Enigma
  5. ssh login nova vm
  6. 弹出框weeboxs 基本属性总结
  7. Swift - 协议(protocol)
  8. ckeditor上传图片的注意点
  9. c#枚举 获取枚举键值对、描述等
  10. IE下javascript cookie path设置Bug
  11. SpringMVC的常用注解
  12. 【Android 应用开发】Android中使用ViewPager制作广告栏效果 - 解决ViewPager占满全屏页面适配问题
  13. python3元组
  14. C#-this关键字的功能之扩展方法
  15. 附8 zipkin
  16. js获取子节点和修改input的文本框内容
  17. Latex 公式颜色
  18. java 线程Thread 技术--1.5 Executor Executors,ThreadPool,Queue
  19. css 单行/多行文字垂直居中问题
  20. DOS批处理基础

热门文章

  1. python购物车升级版
  2. JAVA 基于TCP协议的一对一,一对多文件传输实现
  3. Oracle 统计信息介绍
  4. 【Mac】nsurlsessiond 后台下载问题的解决方法
  5. 【Intellij】导出 jar 包
  6. 【iOS】Your account already has a valid ios
  7. Thread.Sleep太久,界面卡死
  8. 【错误】【vscode】输出中文是乱码问题
  9. 守望先锋app(1)
  10. powerdesign进军(二)--oracle数据源配置