美团团队技术博客深入解析String#intern提到 intern 正确使用例子的代码如下
static final int MAX = 1000 * 10000;
static final String[] arr = new String[MAX];
public static void main(String[] args) throws Exception {
Integer[] DB_DATA = new Integer[10];
Random random = new Random(10 * 10000);
for (int i = 0; i < DB_DATA.length; i++) {
DB_DATA[i] = random.nextInt();
}
long t = System.currentTimeMillis();
for (int i = 0; i < MAX; i++) {
//arr[i] = new String(String.valueOf(DB_DATA[i % DB_DATA.length]));
arr[i] = new String(String.valueOf(DB_DATA[i % DB_DATA.length])).intern();
}
System.out.println((System.currentTimeMillis() - t) + "ms");
System.gc();
}
很好奇为什么要
arr[i] = new String(String.valueOf(DB_DATA[i % DB_DATA.length])).intern();
而不是直接
arr[i] = String.valueOf(DB_DATA[i % DB_DATA.length]);
而且String.intern() is meant to decrease memory use.
,这样子new String后再intern完全不能提升性能吧?
new String().intern()的目的是可以節約記憶體空間,intern之後,如果字串的字面值相同,那麼就不需要再浪費空間重新new一個String物件出來了,直接使用常數池裡的對象引用就可以啦。
當然new String()這一步是不可避免的(String.valueOf內部最終也是new String),不過new String之後沒有變數引用這個實例(arr[i]引用的intern()回傳值,也就是常數池裡的對象),很快就會被GC回收掉的。