String 是Java里面最常用的字符串类型,是不可变的,拼接裁剪都会产生新的String对象。而StringBuilder和StringBuffer常用于要大量拼接字符串的情况;而StringBuilder是非线程安全的,StringBuffer是线程安全的,两者的区别好像只限于StringBuffer在设置的方法上添加了synchronized字符;在拼接不同String对象的时候,就会产生大量中间对象的问题;
扩展1:如何设计一个线程安全类?
Ans:参考StringBuffer类,直接在修改的方法上都加了synchronized
设计的时候优先考虑可靠性、可读性
扩展2:字符串的缓存
JDK6提供了一个intern,显示地排重返回字符串缓存,被缓存的字符串将存在PermGen里,基本也就只能等着FullGC来回收;所以如果使用不当,很容易引发OOM
扩展3:字符串的编码
一般我们用String.getBytes时,都要指定读取的编码格式,不然就会依赖于操作系统的编码格式来返回东西了。一台机器上可能默认返回的事Unicode,到另外一台机器可能就不是了。
网友评论