String,Stringbuilder,Stringbuffer的区别?
– 如果你答string维护的是字符串常量,Stringbuilder,Stringbuffer适合频繁修改字符串的情况,且Stringbuffer线程安全。
这么回答也OK,但是再问你一句为什么?? 怕是就懵逼了,网上搜的答案呀, 也没细品过为什么啊!为什么要问我为什么!
我知道你们懒,这么帮你查一下源码看看为什么。
1. String:
String中维护了一个final的字符数组,用来存储字符串值,且不能修改。构造器也是将char数组和hash进行赋值。所以每次new字符串或者追加字符串的时候,就会在常量池中维护一个新的final数组。
2. Stringbuilder,Stringbuffer
Stringbuilder,Stringbuffer的源码,都是继承了AbstractStringBuilder抽象类的, 其中维护了一个char数组和数组长度count。 这个char数组是可以修改的, 所以每次append的时候,就会来修改char数组, 最后调用toString()方法时,将char数组转为String。
总结:
String:底层维护了一个final的char数组,赋值后就不能修改。 所以每次追加字符串会重新维护一个新的final的char数组。
Stringbuilder,Stringbuffer:都继承了AbstractStringBuilder抽象类,其中维护了一个char数组和数组长度count。 这个char数组是可以修改的,每次追加字符串时,可以修改char数组,不用新创建一个。