コレクションは Java プログラミングで広く使用されており、すべての川を含む海のようなものであり、すべてのものを含む普遍的なコンテナーのようなものです。さらに、この海と普遍的なコンテナーは (条件が許せば) 無限に大きくすることができます。この海やコンテナの体積が非常に大きくなると、海を掘って拡張するには多くの人力、物資、資金が必要となるため、初期の容量が非常に重要になります。同様に、コレクションの初期容量も非常に重要です。したがって: 既知のシナリオの場合は、コレクションの初期容量を指定します。
public static void main(String[] args) { StudentVO student = null; long begin1 = System.currentTimeMillis(); List<StudentVO> list1 = new ArrayList<>(); for(int i = 0 ; i < 1000000; i++){ student = new StudentVO(i,"chenssy_"+i,i); list1.add(student); } long end1 = System.currentTimeMillis(); System.out.println("list1 time:" + (end1 - begin1)); long begin2 = System.currentTimeMillis(); List<StudentVO> list2 = new ArrayList<>(1000000); for(int i = 0 ; i < 1000000; i++){ student = new StudentVO(i,"chenssy_"+i,i); list2.add(student); } long end2 = System.currentTimeMillis(); System.out.println("list2 time:" + (end2 - begin2)); }
上記のコードの 2 つのリストは 1,000,000 個のデータを挿入しますが、list1 には初期化容量が適用されておらず、list2 には 1,000,000 の初期化容量があります。実行結果は次のとおりです。
list1 time:1638 list2 time:921
上記の実行結果から、list2 の速度が list1 の約 2 倍であることがわかります。 LZ は、ArrayList の拡張メカニズムが比較的リソースを消費することを前述しました。まず ArrayList の add メソッドを見てみましょう:
public boolean add(E e) { ensureCapacity(size + 1); elementData[size++] = e; return true; } public void ensureCapacity(int minCapacity) { modCount++; //修改计数器 int oldCapacity = elementData.length; //当前需要的长度超过了数组长度,进行扩容处理 if (minCapacity > oldCapacity) { Object oldData[] = elementData; //新的容量 = 旧容量 * 1.5 + 1 int newCapacity = (oldCapacity * 3)/2 + 1; if (newCapacity < minCapacity) newCapacity = minCapacity; //数组拷贝,生成新的数组 elementData = Arrays.copyOf(elementData, newCapacity); } }
ArrayList に要素が追加されるたびに、ArrayList の現在の容量が臨界点に達したかどうかを検出します。臨界点では容量が1.5倍に拡大します。ただし、ArrayList の拡張と、新しい配列を生成するための配列のコピーは、非常にリソースを大量に消費します。したがって、コレクションの使用シナリオが事前にわかっていて、コレクションのおおよその範囲がわかっている場合は、初期化容量を指定する方が適切です。これにより、特に大容量のデータを前提とした場合、リソースの使用率が向上します。効率が向上し、リソースの利用がより有利になるでしょう。
上記は Java の内容、コレクションの詳細、および初期容量です。その他の関連コンテンツについては、PHP 中国語 Web サイト (www.php.cn) に注目してください。