String 就是一个不可变的类,String字符串底层其实还是用char[] 字节数组实现的,而在jdk源码中,String类不仅是final的,其中里面的char[] 是final的。
源码:
final 关键字用在类上就是String类不能被继承,用在变量上就是不可被改变。
StringBuilder 和 StringBuffer一块说:
Q:StringBuffer和StringBuilder那个线程安全?
A:StringBuilder不安全,StringBuffer安全
StringBuilder中的方法中例如append中,没有进行加锁,它和StringBuffer继承的AbstractStringBuilder类中的可扩展append方法没有进行加锁,如果放在并发情况下,会不安全。而StringBuffer类的append方法中对方法进行用sychronized关键字进行修饰,加锁,因此为安全的。
源码:
Stringbuilder
StringBuffer
AbstractStringBuilder
可以看到的是在AbstractStringBuilder的append中,spaceNeeded = count + appendedLength;时,线程不安全的,但是StringBuffer对其进行加锁了,成了线程安全的了。
最后再回过头说一下,String的安全,String类还会存在什么线程不安全的问题呢?
当然,String本身是没有问题的。问题出在哪里呢?一般来说,我们对定义一个字符串的时候,都会是直接 String str = "hello"; 这样子的。然而 我们再向 str 里进行拼接字符串的时候,比如
str = str + "world"; 用 + 这样的方式直进行拼接。
这样的字节码转过来其实是和StringBuilder先new了一个StringBuilder(str); 然后再对其进行append方法拼接,这样子是不是恍然大悟了!
最后附上一个觉得对String写的比较好的一篇blog,比较值得学习