怎么做网站登陆战,装修效果图网站,云匠网接单子容易吗,公司创建一个网站需要多少钱1、引言
在上一篇文章中#xff0c;我们理解了字符串的常用方法#xff0c;细心的同学大概已经发现#xff0c;不管是将字符串中的字符转变为大写或小写#xff0c;或是完成字符串的替换#xff0c;又或是去除空白字符等等#xff0c;只要涉及到字符串的修改#xff0c…1、引言
在上一篇文章中我们理解了字符串的常用方法细心的同学大概已经发现不管是将字符串中的字符转变为大写或小写或是完成字符串的替换又或是去除空白字符等等只要涉及到字符串的修改我们都是生成了一个新的字符串而不是改变原有的字符串。
例如toLowerCase方法的源码返回新的字符串对象 这是因为String类的对象是不可以被修改的字符串具有不可变性。关于字符串为什么不可以被修改答案就在下面的文章中~
2、字符串为什么具有不可变性
2.1 String类在源码中的设计
2.1.1 String类被final所修饰
为什么不可被修改呢我们先来观察String类的源码 我们可以看到String类被final所修饰但是这并不是字符串不可变的原因因为当类被final修饰时只能说明这个类不能被继承也就是说String类不可被继承而不是不可变。
2.1.2 value被final所修饰
我们继续往下看 我们又发现value数组也被final修饰了我们知道String类的value数组才真正存储了字符串的内容到这里有的同学就开始激动了就说value数组被final修饰了变成了常量常量不可变所以字符串就具有不可变性。
但事实并不是这样因为数组是一个引用类型当引用类型被final修饰只能说明当前引用变量的指向不能改变而并不是不能修改它所指向的内容我们来观察以下代码 我们发现当数组被final修饰后我们可以改变它的内容但是不能改变它的指向也就是说final修饰value数组并不是字符串不可变的原因。很多同学都会在这里产生误解
2.1.3 value数组被private修饰封装 其实这点才是字符串不可变的真正原因value数组被封装在了String类当中没有提供任何的get和set方法无法获取到字符串当然也不可能被修改。
2.2 总结
1.当一个类被final修饰说明这个类不能被继承。也就是说String类被final修饰不是字符串不可变的原因。
2.当一个引用类型被final所修饰说明这个引用的指向不能改变但是可以修改这个引用所指向的内容。也就是说value被final修饰不是字符串不可变的原因。
3.value被private修饰被封装起来才是字符串不可变的真正原因。
3、字符串的修改
3.1 使用对字符串拼接
我们已经理解了字符串为什么不可变也知道了字符串的修改实质上会再创建一个新对象
因此我们每使用一次来完成字符串的拼接(以及对字符串进行修改)实质上就是创建了一个新的String类对象 而每次都要创建新对象会占用大量的内存空间效率非常低下所以我们不推荐这样来完成字符串的拼接为了提高效率我们使用StringBuilder和StringBuffer类来完成对字符串的修改。
3.2 StringBuilder和StringBuffer类
StringBuilder和StringBuffer的功能大部分是相同我们这里就以StringBuilder来讲。
3.2.1 append方法完成拼接
我们可以通过append来完成字符串的拼接拼接在尾部相当于String的 我们可以通过append来拼接多种类型且返回值都是this说明在原来的串上进行的修改不会产生新的对象 拼接完成后我们可以调用StringBuilder中重写的toString方法使用String类型来接收生成的字符串 这样可以减少额外对象的生成大大的提高了效率
3.2.2 StringBuilder和StringBuffer中的字符串修改方法 我们发现在这两大类中提供了能够修改字符串的方法很方便的供我们使用。
例如reverse方法 我们可以很轻松的在原来的字符串上完成字符的逆置。
例如insert方法 我们可以在指定下标处完成插入。
注这些方法都是在原本的字符串上进行的修改不会生成新的对象效率很高。
4、String、StringBuilder、StringBuffer的区别
1.String的内容不可被修改StringBuilder和StringBuffer的内容可以被修改。
2.StringBuilder和StringBuffer的功能大体相同。
3.StringBuffer采用同步处理属于线程安全操作而StringBuilder未采用同步处理属于线程不安全操作。学习中后面再说~