- String类型
- 什么是字符串缓存的intern机制
- 什么是字符串排重
- 什么是intrinsic机制
String类型
类型 | 特点 | 线程安全 | 特点 |
---|---|---|---|
String | 内部结构是final char[]数组。是典型的immutable类 | 安全 | 性能低,字符串操作会产生中间对象 |
StringBuffer | 内部结构是char[]数组。继承AbstractStringBuilder | 安全 | 性能较低,操作都采用synchronized进行加锁 |
StringBuilder | 同上 | 不安全 | 性能高 |
那么,String拼接的场景中是否一定要使用StringBuilder或者StringBuffer?
答案:并不是。原因如下:
-
String的可读性更好一些。
-
JDK 8 开始,"a"+"b"会默认采用StringBuilder实现。
-
JDK 9中,提供更统一的字符串操作优化,提供了StringConcatFactory作为统一入口。
intern机制
JDK对intern影响
JDK 6:intern()方法会把首次遇到的字符串实例复制到永久代,返回的也是永久代实例。
//JDK1.6
String s3 = new String("1") + new String("1");
// 1. 将s3(“11”)的复制品,放到永久带中。
s3.intern();
// 2. s4 = s3的复制品
String s4 = "11";
// 3. 一定不相等,结果为false
System.out.println(s3 == s4);
JDK 7:intern()实现不会复制实例,只是在常量池记录首次出现实例的引用。
//JDK1.7
// 生成常量池中的"1"和生成堆空间中的"11"
String s3 = new String("1") + new String("1");
// 1. 将s3(“11”)的引用记录在常量池中。
s3.intern();
// 2. s4 = s3的引用
String s4 = "11";
// 3. 一定相等,结果为true
System.out.println(s3 == s4);
intern的副作用
- 需要开发者显式调用,使用不方便
- 很难保证效率,因为开发者难以清楚字符串的重复率,最终可能导致代码的污染。
字符串排重
Oracle JDK 8u20后推出了基于G1 GC下的字符串排重。
-
原理:将相同数据的字符串指向同一份数据。
-
实现:
1.开启G1 GC(-XX:+UseG1GC)
2.开启字符串排重功能(-XX:+UseStringDeduplication)
intrinsic机制
- 是一种利用native方法,hard-coded(硬编码)的逻辑,
- 一种特殊的内联(intrinsic-内在的)。
- 很多优化还是需要直接使用特定的CPU指令。
问题:字符串如何利用Intrinsic机制优化的?
- 字符串的特殊操作运行的都是特殊优化的本地代码
- 而不是去运行Java代码生成的字节码
网友评论