Java中String类为何设置成final?

String怎么保证不可变?

虽然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的不可变性。数组

String为何保证不可变?

1.为了实现字符串池

只有当字符串是不可变的,字符串池才有可能实现。字符串池的实现能够在运行时节约不少heap空间,由于不一样的字符串变量都指向池中的同一个字符串。但若是字符串是可变的,那么String interning将不能实现,由于这样的话,若是变量改变了它的值,那么其它指向这个值的变量的值也会一块儿改变。缓存

        2.为了线程安全

由于字符串是不可变的,因此是多线程安全的,同一个字符串实例能够被多个线程共享。这样便不用由于线程安全问题而使用同步。字符串本身即是线程安全的。安全

        3.为了实现String能够建立HashCode不可变性

 由于字符串是不可变的,因此在它建立的时候HashCode就被缓存了,不须要从新计算。这就使得字符串很适合做为Map中的键,字符串的处理速度要快过其它的键对象。这就是HashMap中的键每每都使用字符串。多线程

 

其余观点:

 

其余 包括Integer Long Character 被设计成final的缘由相似spa

https://www.zhihu.com/question/31345592.net

https://blog.csdn.net/bn493235694/article/details/79599883线程

相关文章
相关标签/搜索