String
String类型是不可变类型,使用如下代码来说明:
public class test {
public static void main(String[] args) {
String str = "aaaa";
str = "bbbbb";
System.out.println(str);
}
}
输出结果如下图所示:
test输出结果
这是为什么呢?我们需要参考java8的源码,如下图所示:
String底层源码
可见String的底层使用一个char数组来存储字符串,因此我们可以绘制如下的结构图:
结构图
到这里你应该对String有一个基本的了解了,其实通过上面的图相信你也应该能明白为什么有了String还需要StringBuilder和StringBuffer。那是因为String每一次增删改的操作都是在内存中创建了一个新的字符串,如果增删改的操作很多,那对我们的内存将造成极大的浪费,为此还需要StringBuilder和StringBuffer去解决这个问题。
StringBuilder和StringBuffer
StringBuilder和StringBuffer是可变的,也就说我们的增删改都是在原字符串的基础上操作的,操作次数再多内存也不会被白白的浪费,那他们俩又有什么区别呢?
StringBuffer是线程安全的,支持并发操作,适合多线程。
StringBuilder是线程不安全,不支持并发操作,适合单线程。
也就是说他们俩区别就在于支不支持并发操作,使用上基本上类似,你知道上面的区别之后就可以根据自己的业务需求来决定具体使用哪一个。这里就以StringBuffer为例说明一下吧。
public class test {
public static void main(String[] args) {
StringBuffer str = new StringBuffer("aa");
str.append( "b");
str.insert(1,"fp");
str.reverse();
String mystr = new String(str);
System.out.println(mystr); //bapfa
}
}