深入String
- 一.字符串的存储
- 二.字符串的不可变性
- 三.字符串修改
- 四.StringBuilder和StringBuffer
一.字符串的存储
我们知道双引号里的数据都是字符串常量,储存在字符串常量池当中。
例子
直接使用==是比较地址。字符串常量池有一个特点;它会先检查该常量是否已经存在,如果存在则不再新建。在官方文档里实际上是没有字符串常量池的概念,它底层是一个C++的hash表。它准确来说在方法区,而方法区在堆里。
二.字符串的不可变性
String是一种不可变对象. 字符串中的内容是不可改变。
String类在设计时就是不可改变的,String类实现描述中已经说明了
String类中的字符实际保存在内部维护的value字符数组中,而value是由private修饰的,所以不能提供[]修改value该图还可以看出:
- String类被final修饰,表明该类不能被继承。
- value被修饰被final修饰,表明value自身的值不能改变,即不能引用其它字符数组,但是其引用空间中的内容可以修改。
纠正 :网上有些人说:字符串不可变是因为其内部保存字符的数组被final修饰了,因此不能改变。这种说法是错误的,不是因为String类自身,或者其内部value被final修饰而不能被修改。
final修饰类表明该类不想被继承,final修饰引用类型表明该引用变量不能引用其他对象,但是其引用对象中的内容是可以修改的。
三.字符串修改
注意:尽量避免直接对String类型对象进行修改,因为String类是不能修改的,所有的修改都会创建新对象,效率非常低下。
但是这种方式不推荐使用,因为其效率非常低,中间创建了许多临时对象。虽然看起来只有三个对象,实际上远远不止。
验证一下究竟会产生多少临时对象
1.使用String直接使用+=进行拼接
2.使用StringBuffer调用append进行追加
3.使用StringBuilder调用append进行追加
下面就来聊聊StringBuffer和StringBuilder是什么。
四.StringBuilder和StringBuffer
由于String的不可更改特性,为了方便字符串的修改,Java中又提供StringBuilder和StringBuffer类。这两个类大部分功能是相同的,这里介绍 StringBuilder常用的一些方法。
一些使用例子
从上述例子可以看出:String和StringBuilder最大的区别在于String的内容无法修改,而StringBuilder的内容可以修改。频繁修改字符串的情况考虑使用StringBuilder。
注意:String和StringBuilder类不能直接转换。如果要想互相转换,可以采用如下原则:
1.String变为StringBuilder: 利用StringBuilder的构造方法或append()方法
2.StringBuilder变为String: 调用toString()方法。
总结
String、StringBuffer、StringBuilder的区别:
1.String的内容不可修改,StringBuffer与StringBuilder的内容可以修改.
2.StringBuffer与StringBuilder大部分功能是相似的
3.StringBuffer采用同步处理,属于线程安全操作;而StringBuilder未采用同步处理,属于线程不安全操作