String为啥不可变

经常说String不可变 String到底为啥不可变

先看看Java8中的String源码

1
2
3
4
public 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不可变。


有啥好处

  1. String作为HashMap的key,hash值只需要计算一次。
  2. 字符串常量池需要
    1
    2
    3
    4
    5
    public static void main(String[] args){
    String a= "abc";
    String b= "abc";
    System.out.println("a==b:"+(a==b));//true
    }


如果一个字符串已经被创建过,那么再次创建就会从字符串常量池中取得引用,如果字符串可变,这点不能实现。

  1. 安全性
    网络连接中经常使用String作为连接参数,如果可变的话,改变String的一方认为连接的是其他主机,其实并不是。
  2. 线程安全
    String类不可变所以天生线程安全。