很久以前小A看过一个bug,发生问题的关键代码大概是这样的
String originText = "Hello World!";
originText.trim();
println("text after trim: " + originText);
然后开发小伙伴就一直纠结,为什么字符串中的空格还在呢?
。。。后来小伙伴就被产品杀了祭天了
这个bug其实很简单,因为String是不可变内容的,想获得新值,必须重新赋值。正确应该是
originText = originText.trim();
上面说到,String是不可变内容。可能有人会不解,为什么说是不可变,我平时经常可以改变它的字符串的呀!而且上面的例子里明明就改变了originText的内容! 其实不是。每次对String对象赋值的时候,都是重新给它分配了一个对象,而不是改变内容。 从这个角度上来说,String和StringBuffer/StringBuilder的区别就体现出来了。
其实可以把这两个当做一回事,StringBuilder是Java5里新增的类,用来管理可变内容字符串。 我们用的最多的是用 StringBuilder的 append()方法来在它后面追加新的字符串。
而对StringBuilder对象内容进行修改的时候并不会分配新的对象。这个角度上来说在内存消耗方面StringBuilder和Buffer比String更优。
String和Builder/Buffer的区别在于,String是不可变内容的对象,每次对他的赋值都相当于重新分配了一个对象。 而 Builder/Buffer 是可变内容的,在需要改变字符串内容的场景中,建议使用 Builder/Buffer 来操作。