Heim  >  Artikel  >  Java  >  Java-Verbesserung Kapitel (35) -----Java-Sammlungsdetails (1): Bitte geben Sie die anfängliche Kapazität für die Sammlung an

Java-Verbesserung Kapitel (35) -----Java-Sammlungsdetails (1): Bitte geben Sie die anfängliche Kapazität für die Sammlung an

黄舟
黄舟Original
2017-02-11 10:28:401647Durchsuche

Mengen werden in der Java-Programmierung sehr häufig verwendet. Sie sind wie das Meer, das alle Flüsse umfasst, wie ein universeller Container, der alle Dinge enthält. Darüber hinaus kann dieses Meer und dieser universelle Container unendlich größer sein (sofern die Bedingungen dies zulassen). . Wenn das Volumen dieses Meeres oder Containers sehr groß wird, wird seine anfängliche Kapazität sehr wichtig, da das Ausheben und Erweitern des Meeres eine Menge Arbeitskraft, Material und finanzielle Ressourcen erfordert. Ebenso ist die anfängliche Kapazität der Sammlung äußerst wichtig. Also: Geben Sie für bekannte Szenarien eine Anfangskapazität für die Sammlung an.

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

Der obige Code hat zwei Listen Beide fügen 1.000.000 Datenelemente ein, aber Liste1 hat keine Initialisierungskapazität beantragt, während Liste2 eine Initialisierungskapazität von 1.000.000 hat. Die Laufergebnisse sind wie folgt:

list1 time:1638
list2 time:921

Aus dem obigen Lauf Ergebnisse wir Es ist ersichtlich, dass die Geschwindigkeit von Liste2 etwa doppelt so hoch ist wie die von Liste1. LZ hat bereits erwähnt, dass der Erweiterungsmechanismus von ArrayList relativ ressourcenintensiv ist. Schauen wir uns zunächst die Add-Methode von ArrayList an:

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 Jedes Mal, wenn ein neues Element hinzugefügt wird, wird festgestellt, ob die aktuelle Kapazität der ArrayList den kritischen Punkt erreicht hat. Wenn der kritische Punkt erreicht wird, wird die Kapazität um das 1,5-fache erweitert. Allerdings sind die Erweiterung von ArrayList und das Kopieren von Arrays zur Generierung neuer Arrays recht ressourcenintensiv. Wenn wir daher das Nutzungsszenario der Sammlung im Voraus kennen und den ungefähren Bereich der Sammlung kennen, sollten wir die Initialisierungskapazität besser angeben, damit die Ressourcennutzung besser ist, insbesondere unter der Voraussetzung eines großen Datenvolumens. Die Effizienz wird verbessert und die Ressourcennutzung wird vorteilhafter erscheinen.

Das Obige ist der Java-Inhalt, die Sammlungsdetails und die anfängliche Kapazität. Bitte achten Sie darauf zur chinesischen PHP-Website (www.php.cn)!


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn