从网上看了很多的信息,说的大部分是关于final修饰的原因,却没有详细的解释!根据自己收集的资料,跟大家分享一下我的观点(有错请指正)。
1.我们都知道在修改字符串长度的时候,StringBuffer和StringBuilder的修改字符串效率要高于String,原因也是简单的,因为StringBuffer和StringBuilder在修改的时候,不会重新创建对象,而String却是要重新创建对象的。
有人说这种情况的原因在于String是被final修饰的,一旦创建便不能修改。但是StringBuffer和StringBuilder同样是final修饰的,大家有没有想过为什么他们可以修改呢? 如图

String的图

StringBuffer(StringBuilder一样)的图

所以原因并不在于StringBuffer和StringBuilder还有String是被final修饰的!
那么真实的原因是什么?
我们要知道,字符串在本质上是字符数组,所以我们来看看StringBuffer和StringBuilder还有String是如何定义字符数组的,通过对数组的定义来发现其中的原理。 如图

StringBuilder的源码图(因为StringBuilder中大多数方法都是调用父类的AbstractStringBuilder,所以直接上父类源码,StringBuffer是一样的)

String的源码图

发现了吗?两者的区别在于String的字符数组是final修饰的,而StringBuffer和StringBuilder并没有!

详细解释

或许在这里有人说,在java里数组的长度是不可变的,所以有final修饰数组和没有final修饰没有区别!在这里要说确实,数组是不可更改的,但是我们要改的并不是数组,而是类中的一个属性!
final修饰的属性是最终的,不可更改!没有final修饰的属性是可以修改的!
这样就造成,String中的字符数组属性一旦创建,便无法修改!要修改字符数组的属性,就只能重新新造一个字符数组,也就是新创建一个String对象!这就相当于字符数组属性和String形成了一个整体,牵一发而动全身!
而StringBuffer和StringBuilder中的字符数组属性可以更改,在修改字符串时,可以通过修改没有fianl修饰的字符数组属性,而不用重新创建对象。

一定要看的干货

最新文章

  1. Spring-test使用JUnit时,测试类autowired报错,create bean error
  2. 剑指offer编程题java实现(正在更新)
  3. java替换包含html标签
  4. Office 365 - SharePoint 2013 Online 中创建母版页
  5. Android网络开发之实时获取最新数据
  6. ABAP ole方式对EXCEL进行操作
  7. iOS 文件大小转换成 KB、MB、GB 。。。
  8. HDU 4667 Building Fence
  9. FormsAuthentication.GetRedirectUrl 方法
  10. Java生成文件
  11. Centos 开机后,登录时无法输入密码怎么解决
  12. Springboot(二):Spring Boot 之 HelloWorld
  13. Spark 读写hive 表
  14. ES5新增
  15. (3)编译安装lamp三部曲之php-技术流ken
  16. hdu6133 Army Formations 线段树合并
  17. std::string 字符串替换
  18. python摸爬滚打之day05----字典
  19. PHP配置方法
  20. Leetcode题库——16.最接近的三数之和

热门文章

  1. html5 cavans的小应用
  2. 深入理解JAVA字符串常量池
  3. python浅学【网络服务中间件】之MongoDB
  4. 最大比率传输(Maximum Ratio Transmission, MRT)原理分析
  5. 多线程之旅(Thread)
  6. 条件随机场 CRF
  7. 移动深度学习 Mobile-deep-learning(MDL)
  8. Python NLP库top6的介绍和比较
  9. Go语言micro之快速搭建微服务
  10. coding++:JS/jQuery获取兄弟姐妹等元素