java当中的字符串类主要有三种:String 、StringBuffer、StringBuilder.
这里就要说说java创建对象的机制,比如:String a="123";在java JVM(虚拟机)中的栈内存中创建了一个名为a的变量,堆内存中穿件了一个值为“123”的字符串对象,a指向了“123”字符串对象的地址。当我们再次创建String b=“123”;时,在栈内存中创建了一个b变量,堆内存已经有“123”字符串了,不需要重新创建,所以b直接指向“123”的堆内存对象,a和b共用一个堆内存对象,很好的节约了资源。
测试代码:
String a="123";
String b="123";
System.out.println(a==b);
结果是---------------------
true
因为等号比较的是两个对象的堆内存地址,所以两个相等!这里就要提enquals()方法:
原生的的equals()方法是要求地址和内容都一样才返回true,但是String中的equals()经过重写,只对比的是对象对应的值,和地址无关。而StringBuffer和StringBuilder中的equals()方法没有经过重写,所以是要对比地址和内容的。这里要注意。
Sring的对象修改时,例:
Stirng a="12";
a=a+"345";
论执行速度来分的话:string<StringBuffer<StringBuilder。
string的对象修改的时候,是创建了一个新对象,而旧对象等待java的垃圾处理器回收。StringBuffer和StringBuilder都是在原有基础上改变的。而StringBuffer是线性安全的,StringBuilder是非线性安全的,StringBuffer大部分方法前都有关键字synchronized。所以运行速度比StringBuilder慢。
因为StringBuilder和StringBuffer都是不创建新对象,直接在旧对象中修改,所以快!