String总结
- 内部数据结构为不可变的char[]和一个hash值。
- 不可变的类,每一个修改的String的方法都会创建一个全新的String对象。
- String重载的‘+’号,使String对象可以相+,内部实现使用StringBuilder对象。
- Switch对String的支持(java 8),本质是调用hashCode()和equals()方法保证;
- 直接使用字面量(双引号)声明出的String对象的引用会存入字符串常量池(JVM维护的一个特殊内存块,堆内存中的永久代)
- 构造器创建的String可使用intern方法,该方法会返回字符串常量池的相同的字符串对象引用,如果没有则先添加到字符串常量池中在返回。
解释下,字符串常量池的好处就是减少相同内容字符串的创建,节省内存空间。牺牲了CPU计算时间来换空间。CPU计算时间主要用于在字符串常量池中查找是否有内容相同对象的引用。不过其内部实现为哈希数组,像HashTable这种结构,所以计算成本较低
。
注:另外如:String str = “a” + “b” + “c”; 编译器会优化成 String str = “abc”; 存入字符串常量池中
final String str1 = “a”; String a1 = str1 + “b”; 因为String对象本身不可变,在加上final修饰表示引用变量str1将始终指向“a”这个对象,所以编译器可以十分确定str1就是"a",便可优化a1 = “ab”;也将存入字符串常量池中。
提示
:当存在大量相同的字符串时,使用intern可节省大量空间,因为intern方法可以使相同字符串引用指向字符串常量池中相同的一块字符串对象,这样引用原先指向的字符串对象便会失去(强)引用,对象便可被垃圾回收内存空间可以重新利用。
详细参考如下文章
https://tech.meituan.com/2014/03/06/in-depth-understanding-string-intern.html
String类相关方法使用与正则总结
https://blog.csdn.net/qq_29537835/article/details/79754003
☀>.freerme、我是lilee[https://blog.csdn.net/freerme]