开发工具与关键技术:MyEclipse 10、JavaSE
撰写时间:2019年07月06日
操作字符串的类有:String、StringBuffer、StringBuilder。
java.lang.String类使用了final修饰,所以不能被继承,转到源码如下:
String 和 StringBuffer、StringBuilder 的区别在于 String 声明的是不可变的对象,每一个看起来会修改String值的方法,实际上都是创造了一个全新的String对象,然后将指针指向新的 String 对象。
String a = "炸鸡";
//不会创建新的String对象,而是使用常量池中已有的"炸鸡",
String b = "炸鸡";
//使用new关键字会创建新的String对象,所以下面判断 a==c 时输出 false
String c = new String("炸鸡");
System.out.println(a == b); // true
System.out.println(a == c); // false
String a = “炸鸡”; 与 String c = new String (“炸鸡”); 不一样是因为它们内存的分配方式不一样。
String a = “炸鸡”;的方式,java 虚拟机会将其分配到常量池中,对于重复出现的字符串直接量,JVM会首先在常量池中查找,如果常量池中存在即返回该对象;
而 String c = new String (“炸鸡”); 则会被分到堆内存中(堆内存用于存放由new创建的对象和数组。在堆中分配的内存,由java虚拟机自动垃圾回收器来管理。即使程序运行到使用new产生数组和对象的语句所在地代码块之外,数组和对象本身占用的堆内存也不会被释放,数组和对象在没有引用变量指向它的时候,才变成垃圾,不能再被使用,但是仍然占着内存,在随后的一个不确定的时间被垃圾回收器释放掉)。
而 StringBuffer、 StringBuilder 可以在原有对象的基础上进行操作,所以如果你要经常改变字符串内容的话就最好不要使用 String,但是String中的对象是不可变的,也就可以理解为常量,所以是线程安全的。
StringBuilder与StringBuffer的共同点:
StringBuilder与StringBuffer有公共的抽象父类AbstractStringBuilder。StringBuilder、StringBuffer的方法都会调用AbstractStringBuilder中的公共方法,如super.append(…)。
它们可以通过append()、insert()、reverse()…等方法来修改值。创建的对象是可变。
StringBuffer 和 StringBuilder 最大的区别在于,StringBuffer 是线程安全的,而 StringBuilder 是非线程安全的。
因为StringBuffer对方法加了同步锁(synchronized关键字)进行同步或者对调用的方法加了同步锁,所以是线程安全的。StringBuffer部分源码如下:
StringBuilder并没有对方法进行加同步锁,所以是非线程安全的。
但 StringBuilder 的性能却高于 StringBuffer,所以在单线程环境下推荐使用 StringBuilder,多线程环境下推荐使用 StringBuffer。
String、StringBuffer和StringBuilder 三者在执行速度方面的的速度比较:
StringBuilder > StringBuffer > String
在拼接字符串方面String的“+” 比 StringBuffer 、StringBuilder 的 Append() 性能差了很多。