也许你也和我一样以前只知道用这几个类,但是具体的他们有什么区别可能都不太清楚。这里总结一下
本节类容:
①:String 类的特别之处
②:StringBuffer的优势
③:StringBulider的强势出现
④:总结
①:String的对象它是一个不可变,String类中凡是会修改String类的都是新new了一个对象的那么它原来的对象是没有修改的!这也是困扰很多人传递参数时到底传得是什么的问题(传值还是传引用)
这里引用一下源码中的 String concat(String str) 方法来证明String对象是不可变的。当变化的时候都是产生了一个新的对象
public String concat(String str) {
int otherLen = str.length();
if (otherLen == 0) {
return this;
}
char buf[] = new char[count + otherLen];
getChars(0, count, buf, 0);
str.getChars(0, otherLen, buf, count);
return new String(0, count + otherLen, buf);
}
返回处表示出现了一个新对象而传入str并没有变化还是原来的对象,在这里需要说明的是其实并没有传值还是传引用的说法。其实都是传的值的拷贝。只是不同的是:对主类型而言传的是值的拷贝,而对对象而言传递的是引用的拷贝!
②:StringBuffer的出现是为了解决上述问题的
StringBuffer是继承至 AbstractStringBuilder ,它最大的特点有两个:a:定义了大量的方法进行对String功能的模拟; b:多线程之中的使用,应为StringBuffer是线程安全的
③:StringBulider的强势出现--->速度决定一切
由于StringBuffer是线程安全的这样也导致了速度上就不行了,而很多时候当在单线程中我们需要速度上的优势的时候就显得无能为力了。这时候StringBulider就产生了。它是一个非线程安全的,但是速度会更快,这点可以通过JVM的工作来说明
先看下面一个例子:这里就是简单输出语句
public class StringBuliderTest {
public static void main(String[] args) {
System.out.println("aaa");
}
当我们查看虚拟机是怎么处理这个程序的时候你会发现StringBulider出现了
学过汇编语言的应该都知道上面的意思。这里我们只需要关注的是编译器会自动的引入StringBulider类,因为它效率更高!
④:总结
String类少用
StingBuffer多用于多线程中
StringBulider速度优势更适合在单线程中使用
----------------------------------------------------------QQ学习群: 79369965---------------------------------------------------