虽然final表明了不可变,但仅仅是引用地址不可变,并不表明了数组自己不会变,如:json
import com.alibaba.fastjson.JSON; public class Test { public static void main(String[] args) { final int[] i = {1, 2, 3, 4}; System.out.println(JSON.toJSONString(i));//[1,2,3,4] i[2] = 5; System.out.println(JSON.toJSONString(i));//[1,2,5,4] } }
final也能够将数组自己改变的,这个时候,起做用的还有private,正是由于二者保证了String的不可变性。数组
只有当字符串是不可变的,字符串池才有可能实现。字符串池的实现能够在运行时节约不少heap空间,由于不一样的字符串变量都指向池中的同一个字符串。但若是字符串是可变的,那么String interning将不能实现,由于这样的话,若是变量改变了它的值,那么其它指向这个值的变量的值也会一块儿改变。缓存
由于字符串是不可变的,因此是多线程安全的,同一个字符串实例能够被多个线程共享。这样便不用由于线程安全问题而使用同步。字符串本身即是线程安全的。安全
由于字符串是不可变的,因此在它建立的时候HashCode就被缓存了,不须要从新计算。这就使得字符串很适合做为Map中的键,字符串的处理速度要快过其它的键对象。这就是HashMap中的键每每都使用字符串。多线程
其余 包括Integer Long Character 被设计成final的缘由相似spa
https://www.zhihu.com/question/31345592.net
https://blog.csdn.net/bn493235694/article/details/79599883线程