Maison >Java >javaDidacticiel >Chapitre d'amélioration Java (35) -----Détails de la collection Java (1) : veuillez spécifier la capacité initiale de la collection

Chapitre d'amélioration Java (35) -----Détails de la collection Java (1) : veuillez spécifier la capacité initiale de la collection

黄舟
黄舟original
2017-02-11 10:28:401725parcourir

Les ensembles sont très largement utilisés en programmation Java. Ils sont comme la mer, embrassant toutes les rivières, comme un conteneur universel, contenant toutes choses. De plus, cette mer et ce conteneur universel peuvent être infiniment plus grands (si les conditions le permettent). . Lorsque le volume de cette mer ou de ce conteneur devient très important, sa capacité initiale deviendra très importante, car creuser et agrandir la mer nécessite beaucoup de main d'œuvre, de ressources matérielles et financières. De la même manière, la capacité initiale de collecte est également extrêmement importante. Alors : Pour les scénarios connus, précisez une capacité initiale pour la collecte.

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));
    }

Le code ci-dessus a deux lists Les deux insèrent 1 000 000 de données, mais list1 n'a pas demandé de capacité d'initialisation, tandis que list2 a une capacité d'initialisation de 1 000 000. Les résultats en cours d'exécution sont les suivants :

list1 time:1638
list2 time:921

De la course ci-dessus résultats nous On peut voir que la vitesse de list2 est environ le double de celle de list1. LZ a mentionné précédemment que le mécanisme d'expansion d'ArrayList est relativement consommateur de ressources. Examinons d'abord la méthode d'ajout d'ArrayList :

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 à chaque fois qu'un nouvel élément est ajouté, il sera détecté si la capacité actuelle de l'ArrayList a atteint le point critique. Si elle atteint le point critique, la capacité sera augmentée de 1,5 fois. Cependant, l'expansion d'ArrayList et la copie de tableaux pour générer de nouveaux tableaux nécessitent beaucoup de ressources. Par conséquent, si nous connaissons à l'avance le scénario d'utilisation de la collection et connaissons la portée approximative de la collection, nous ferions mieux de spécifier la capacité d'initialisation, afin que l'utilisation des ressources soit meilleure, en particulier dans le cas d'un grand volume de données. l'efficacité sera améliorée et l'utilisation des ressources sera améliorée.

Ce qui précède est le contenu de Java, les détails de la collection et la capacité initiale. Pour plus de contenu connexe, veuillez faire attention. sur le site Web PHP chinois (www .php.cn) !


Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn