ホームページ  >  記事  >  Java  >  Java の改善 (35) -----Java コレクションの詳細 (1): コレクションの初期容量を指定してください

Java の改善 (35) -----Java コレクションの詳細 (1): コレクションの初期容量を指定してください

黄舟
黄舟オリジナル
2017-02-11 10:28:401649ブラウズ

コレクションは 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) に注目してください。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。