Java基础-----为什么String是不可变的

转发:https://blog.csdn.net/qq_36632687/article/details/79655030

为什么String是不可变的

String所有属性都被final修饰、私有的并且没有提供修改方法。 (主要字段是char数组,虽然被final修饰但数组是可变的,私有保证了不被修改但还是可以通过反射来改变String)

为什么String设计成final

避免被继承后破坏,防止方法被重写。

为什么String设计成不可变的

1、字符串常量池的需要,提升效率和减少内存分配。
2、安全性考虑,防止被意外修改(HashSet中存的值如果是可变的String,则破坏了唯一性;不可被写所以线程安全;)。
3、作为HashMap、HashTable等hash型数据key的必要。因为不可变的设计,jvm底层很容易在缓存String对象的时候缓存其hashcode,这样在执行效率上会大大提升。

创建变量

1、显式的String常量
String a = “test”;
在常量池中创建了String对象,若存在则不创建返回相同对象
2、String对象
String a = new String(“test”);
Class被加载时就在常量池创建了String对象(若有就不创建),执行时在堆中创建String对象。

intern()方法

intern用来返回常量池中的某字符串,如果常量池中已经存在该字符串,则直接返回常量池中该对象的引用。否则,在常量池中加入该对象,然后返回引用。

推荐阅读:
Java-String.intern的深入研究:https://www.cnblogs.com/Kidezyq/p/8040338.html
Java中字符串内存位置浅析:https://www.cnblogs.com/holten/p/5782596.html
Java中的String为什么是不可变的? – String源码分析:https://blog.csdn.net/zhangjg_blog/article/details/18319521
请别再拿“String s = new String(“xyz”);创建了多少个String实例”来面试了吧:http://rednaxelafx.iteye.com/blog/774673

猜你喜欢

转载自blog.csdn.net/yuming226/article/details/84592680