2016-09-20 5 views
-2

かなり単純なコードで奇妙な結果が得られます。 、LinkedListとJavaのArrayListとのオーバーフローの実行時間

List<Integer> arrayList = new ArrayList<Integer>(6200000); 
    List<Integer> linkedList = new LinkedList<Integer>(); 

    for (int i = 0; i < 6200000; i++) 
    { 
     arrayList.add(i); 
    } 

    long startTime = System.currentTimeMillis(); 
    for (int i = 0; i < 6200000; i++) 
    { 
     linkedList.add(i); 
    } 
    System.out.println(System.currentTimeMillis() - startTime); 

ここで問題です::ここ は、問題のコードです サイズはArrayListのCTORの引数として与えられた場合、 「新しいArrayListを(620万)」のようには、印刷された値がされます "new ArrayList()"のように、ArrayList CTORにサイズが指定されていない場合、印刷される値は1000または1000を超えるビットです。 複数の実行では異なる値が与えられますが、私の指摘は、記述された2つのシナリオの間には大きな違いがあり、私はちょうど理由を立てる。 ArrayListの構築方法は、LinkedListに関連するコードにどのように影響しますか? 誰か手掛かりがありますか?

ありがとうございます!

+1

悪いベンチマークを作成すると、混乱する結果を招くことがあります。 – Kayaman

答えて

1

ノードをLinkedListに追加するときは、メモリアロケータを強調するために、多数のオブジェクト(値ごとに2つ)を作成します。最初のインスタンスのように非常に大きなデータ構造を作成すると、メモリサイズが拡大するように集中します。 new ArrayList()の場合、ArrayListのサイズを何度も変更する必要があるため、ほとんどの場合、エデンのサイズが大きくなると、寿命の短いオブジェクトが高速化されます。私はこのテストを実行している間にヒープサイズが何をしているのかを見て、メモリがどのように大きくなっているかを確認します。

関連する問題