Programování

Vektor nebo ArrayList - co je lepší?

Otázka: Vector nebo ArrayList - co je lepší a proč?

A: Někdy Vektor je lepší; někdy ArrayList je lepší; někdy ani nechcete použít. Doufám, že jste nehledali snadnou odpověď, protože odpověď závisí na tom, co děláte. Je třeba vzít v úvahu čtyři faktory:

  • API
  • Synchronizace
  • Růst dat
  • Vzory použití

Pojďme prozkoumat každý po druhém.

API

v Programovací jazyk Java (Addison-Wesley, červen 2000) Ken Arnold, James Gosling a David Holmes popisují Vektor jako analog k ArrayList. Z pohledu API jsou si tedy tyto dvě třídy velmi podobné. Mezi těmito dvěma třídami však stále existují zásadní rozdíly.

Synchronizace

Vektory jsou synchronizovány. Jakákoli metoda, která se dotkne VektorObsah je bezpečný pro vlákna. ArrayList, na druhou stranu, je nesynchronizovaný, což je tedy není bezpečné pro vlákna. S ohledem na tento rozdíl způsobí použití synchronizace výkonnostní zásah. Pokud tedy nepotřebujete kolekci bezpečnou pro vlákna, použijte ArrayList. Proč zbytečně platit cenu synchronizace?

Růst dat

Interně oba ArrayList a Vektor přidržte jejich obsah pomocí Pole. Tuto skutečnost musíte mít na paměti při používání některého ze svých programů. Když vložíte prvek do souboru ArrayList nebo a Vektor, bude objekt muset rozšířit své vnitřní pole, pokud mu dojde místnost. A Vektor výchozí nastavení je zdvojnásobení velikosti pole, zatímco ArrayList zvětšuje velikost pole o 50 procent. V závislosti na tom, jak tyto třídy používáte, můžete při přidávání nových prvků skončit velkým zásahem do výkonu. Vždy je nejlepší nastavit počáteční kapacitu objektu na největší kapacitu, kterou váš program bude potřebovat. Pečlivým nastavením kapacity se můžete vyhnout zaplacení pokuty potřebné k pozdější změně velikosti interního pole. Pokud nevíte, kolik dat budete mít, ale víte, jak rychle rostou, Vektor má malou výhodu, protože můžete nastavit hodnotu přírůstku.

Vzory použití

Oba ArrayList a Vektor jsou dobré pro načítání prvků z určité pozice v kontejneru nebo pro přidávání a odebírání prvků z konce kontejneru. Všechny tyto operace lze provádět v konstantním čase - O (1). Přidávání a odebírání prvků z jakékoli jiné polohy se však ukazuje jako dražší - přesněji lineární: O (n-i), kde n je počet prvků a i je index přidaného nebo odebraného prvku. Tyto operace jsou dražší, protože musíte posunout všechny prvky v indexu i a výše o jeden prvek. Co to všechno znamená?

To znamená, že pokud chcete indexovat prvky nebo přidat a odebrat prvky na konci pole, použijte buď a Vektor nebo ArrayList. Pokud chcete s obsahem udělat něco jiného, ​​najděte si jinou třídu kontejnerů. Například Spojový seznam může přidat nebo odebrat prvek na libovolné pozici v konstantním čase - O (1). Indexování prvku je však o něco pomalejší - O (i) kde i je index prvku. Křížení ArrayList je také jednodušší, protože místo vytvoření iterátoru můžete jednoduše použít index. The Spojový seznam také vytvoří vnitřní objekt pro každý vložený prvek. Musíte si být vědomi toho, jaké další odpadky se vytvářejí.

Nakonec v "PRAXIS 41" od Praktická Java (Addison-Wesley, únor 2000) Peter Haggar navrhuje, abyste místo jedné použili obyčejné staré pole Vektor nebo ArrayList - zejména pro kód kritický pro výkon. Pomocí pole se můžete vyhnout synchronizaci, voláním dalších metod a neoptimální změně velikosti. Zaplatíte pouze náklady na čas navíc.

Další informace o tomto tématu

  • Programovací jazyk Java Ken Arnold, James Gosling a David Holmes (Addison-Wesley, červen 2000; ISBN0201704331)

    //www.amazon.com/exec/obidos/ASIN/0201704331/javaworld/

  • Praktická Java Peter Haggar (Addison-Wesley, únor 2000; ISBN0201616467)

    //www.amazon.com/exec/obidos/ASIN/0201616467/javaworld/

  • Chcete více? Viz Java Q&A Rejstřík pro celý katalog otázek a odpovědí

    //www.javaworld.com/javaworld/javaqa/javaqa-index.html

  • Pro více než 100 bystrých tipů pro Javu od nejlepších odborníků v oboru navštivte JavaWorld 's Tipy pro Java index

    //www.javaworld.com/javatips/jw-javatips.index.html

  • Zaregistrujte se JavaWorld tento týden bezplatný týdenní e-mailový zpravodaj o novinkách na JavaWorld

    //idg.net/jw-subscribe

Tento příběh „Vektor nebo ArrayList - co je lepší?“ byl původně publikován společností JavaWorld.