java 中操作字符串都有哪些类?它们之间有什么区别?

有三个分别是String,StringBuffer,StringBuilder。

1.String

String是不可变得对象,在堆中,String的改变会非常消耗内存,直接上图

所以只是在String str="hello" 变成String str="hello"+"world"堆就占了三个内存,还有两个是无引用对象,这太浪费了。所以在经常改变字符串值得String类型不要用String

2.StringBuffer与StringBuilder

StringBuffer和StringBuilder在修改的时候与String不同,StringBuffer与StringBuilder是在原有的基础上修改,不产生新的未使用对象,不会改变引用。也就是不会产生新对象,StringBuffer是线程安全的,但是StringBuilder是线程不安全的,StringBuffer在大多数情况下比String块,但是比不上StringBuilder。所以单线程建议用StringBuilder,多线程建议用StringBuffer。

StringBuffer和StringBulider只能new,不能进常量池。

每个StringBuffer对象都有一定的缓冲区容量,当字符串大小没有超过容量时,不会分配新的容量,当字符串大小超过容量时,会自动增加容量 



3.在某些特殊情况下,String的速度会优于StringBuffer比如说

String S1 = "This is only a" + " simple" + " test";

StringBuffer Sb = new StringBuffer("This is only a").append(" simple").append(" test");

在这个例子中S1 String 对象的字符串拼接"This is only a" + " simple" + " test";会直接在编译期就合并成常量This is only a simple test

在jvm眼里S1是这样的  String S1 = “This is only a simple test”; 但是如果是

String S2 = “This is only a”;

String S3 = “ simple”;

String S4 = “ test”;

String S1 = S2 +S3 + S4;那么jvm还会按照老规矩去一步一步弄。并且创建一堆无引用对象。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。