検索

ホームページ  >  に質問  >  本文

java - String intern问题

美团团队技术博客深入解析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完全不能提升性能吧?

PHP中文网PHP中文网2770日前698

全員に返信(1)返信します

  • 黄舟

    黄舟2017-04-17 16:16:23

    new String().intern() の目的は、メモリ スペースを節約することです。インターンの後、文字列のリテラル値が同じであれば、新しい String オブジェクトを作成するためにスペースを無駄にする必要はありません。定数プール内で直接使用するだけで十分です。

    もちろん new String() ステップは避けられません (String.valueOf は内部的には最終的に new String です)。しかし、 new String の後にこのインスタンスを参照する変数はありません (arr[i] によって参照される intern() の戻り値、これはプール内の定数オブジェクトです) は、すぐに GC によってリサイクルされます。

    返事
    0
  • キャンセル返事