String与StringBuffer和StringBuilder的根本区别(String为什么无法修改字符串长度)
从网上看了很多的信息,说的大部分是关于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修饰的字符数组属性,而不用重新创建对象。
一定要看的干货
String与StringBuffer和StringBuilder的根本区别(String为什么无法修改字符串长度)的更多相关文章
- String、StringBuffer和StringBuilder类的区别
Java提供了String.StringBuffer和StringBuilder类来封装字符串,并提供了一系列操作字符串对象的方法. 它们的相同点是都用来封装字符串:都实现了CharSequence接 ...
- Java基础知识(JAVA中String、StringBuffer、StringBuilder类的区别)
java中String.StringBuffer.StringBuilder是编程中经常使用的字符串类,他们之间的区别也是经常在面试中会问到的问题.现在总结一下,看看他们的不同与相同. 1.可变与不可 ...
- String、Stringbuffer和Stringbuilder之间的区别
关于这三个类在字符串处理中的位置不言而喻,那么他们到底有什么优缺点,到底什么时候该用谁呢?下面我们从以下几点说明一下 1.在执行速度方面:Stringbuilder>Stringbuffer&g ...
- String,StringBuffer,StringBuilder三者的区别
相同点: String,StringBuffer,StringBuilder,都是final类,不允许被继承,在本质上都是字符数组, 不同点: 1.String的长度是不可变的而后两者长度可变,在进行 ...
- String、StringBuffer、StringBuilder之间的区别
String 字符串常量 StringBuffer 字符串变量(线程安全) StringBuilder 字符串变量(非线程安全) ...
- Java String、StringBuffer、StringBuilder有什么区别
① String是Java语言非常基础和重要的类,提供了构造和管理字符串的各种基本逻辑.它是典型的immutable类,被声明成final class,所有属性也都是final的,由于它的不可变性,类 ...
- String、StringBuffer、StringBuilder有什么区别
区别 先说说String和StringBuffer/StringBuilder: String是标准的不可变类,是一个字符串常量池,并且声明的对象在方法中是唯一存在的. StringBuffer/St ...
- String、StringBuffer、StringBuilder有什么区别?
1.在字符串不经常发生变化的业务场景优先使用String(代码更清晰简洁).如常量的声明,少量的字符串操作(拼接,删除等). 2.在单线程情况下,如有大量的字符串操作情况,应该使用StringBuil ...
- 浅谈java中的String、StringBuffer、StringBuilder类的区别以及关系
在java中最常见的使用就是对字符串的操作:首先先说一下对字符串的理解:字符串就是一连串字符序列,Java提供了String和StringBuffer两个类来封装字符串,并提供一系列方法来操作字符串对 ...
随机推荐
- 前端基础面试题(js部分)
前端基础面试题(JS部分) 1.几种基本数据类型?复杂数据类型?值类型和引用数据类型?堆栈数据结构? 基本数据类型:Undefined.Null.Boolean.Number.String值类 ...
- mybatis探究之延迟加载和缓存
mybatis探究之延迟加载和缓存 一.什么是延迟加载 1.延迟加载的概念 在mybatis进行多表查询时,并非所有的查询都需要立即进行.例如在查询带有账户信息的用户信息时,我们们并不需要总是在加载用 ...
- 【Linux】linux系统管理---好用的一些开源工具
目录 linux系统管理---好用的一些开源工具 htop dstat Glances iftop nethogs iotop linux系统管理---好用的一些开源工具 htop htop是一款运行 ...
- 使用AJAX实现用户名的唯一性校验(注册界面)-JAVA(新手)
(1)实现用户名的唯一性校验 所需要准备的: Servlet 注册界面的JSP 接口和实现类 所需要的接口和实现类: 接口: /* * 用户注册 * 账号的唯一性校验,需要传参(username) * ...
- Linux---使用kill杀不掉进程解决方案
今天打开Linux虚拟机,然后使用jps命令查看,莫名奇妙多了一个1889进程 然后使用kill杀掉后,再运行jps还是存在此进程.于是乎开始大量百度,最终找到了解决方案. 说的很清楚了,杀不掉的原因 ...
- 2019HECTF总结_web题
奇怪的编码 ♭|§∮♯♭|§∮♬♭|§§♫♭|§∮§♭|§♩§♭|♯♬¶♭|§§♫♭|§§¶♭|♯¶§♭|♯¶♫♭|§∮♭♭|§§♫♭|§§♬♭|♯♬♪♭|♯¶♪♭|♯¶|♭|♯¶♯♭|♯♬♬♭|♯♬ ...
- Linux下Tomcat优化
/etc/profileexport JAVA_OPTS="-server -showversion -Xms2048m -Xmx2048m -XX:PermSize=256m -XX:Ma ...
- 贵州省网络安全知识竞赛个人赛Writeup
首先拖到D盾扫描 可以很明显的看出来确实就是两个后门 0x01 Index.php#一句话木马后门 0x02 About.php#文件包含漏洞 都可以很直观的看出来非常明显的漏洞,第一个直接就是eva ...
- IOS(苹果手机)使用video播放HLS流,实现在内部播放及全屏播放(即非全屏和全屏播放)。
需求: 实现PC及移动端播放HLS流,并且可以自动播放,在页面内部播放及全屏播放功能. 初步:PC及安卓机使用hls.js实现hls流自动播放及全屏非全屏播放 首先使用了hls.js插件,可以实现在P ...
- 编译原理:非确定的自动机NFA确定化为DFA
1.设有 NFA M=( {0,1,2,3}, {a,b},f,0,{3} ),其中 f(0,a)={0,1} f(0,b)={0} f(1,b)={2} f(2,b)={3} 画出状态转换矩阵 ...