经常说String不可变 String到底为啥不可变
先看看Java8中的String源码1
2
3
4public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final char value[];
String类用final修饰,底层使用char数组value存储字符。
一个类用final修饰,说明它不可被继承,即没有子类可以继承String类和重写String类的方法,并且char数组用final修饰,一旦初始化,无法引用其他数组,而且String内部没有修改char数组的方法。因此String不可变。
有啥好处
- String作为HashMap的key,hash值只需要计算一次。
- 字符串常量池需要
1
2
3
4
5public static void main(String[] args){
String a= "abc";
String b= "abc";
System.out.println("a==b:"+(a==b));//true
}
如果一个字符串已经被创建过,那么再次创建就会从字符串常量池中取得引用,如果字符串可变,这点不能实现。
- 安全性
网络连接中经常使用String作为连接参数,如果可变的话,改变String的一方认为连接的是其他主机,其实并不是。 - 线程安全
String类不可变所以天生线程安全。