Frage

Ich benutze oft eine ArrayList anstelle eines 'normalen' array[].

Ich fühle mich, als ob ich zu betrügen (oder faul), wenn ich einen ArrayList verwenden, wann ist es in Ordnung, ein ArrayList über ein Array zu benutzen?

War es hilfreich?

Lösung

Arrays sind stark typisiert, und arbeiten gut als Parameter. Wenn Sie die Länge Ihrer Sammlung kennen und es festgelegt ist, sollten Sie einen Array verwenden.

Arraylists sind nicht stark typisiert, wird jede Insertion oder Wiederaufnahmeverfahren ein gegossenes müssen zurück zu Ihrem ursprünglichen Typ zu erhalten. Wenn Sie eine Methode benötigen eine Liste eines bestimmten Typs zu übernehmen, fallen Arraylisten kurz, weil Sie in einem Arraylist enthält jede Art passieren könnte. Arraylisten verwenden, um eine dynamisch intern erweitert Array, so gibt es auch einen Hit, die Größe des internen Arrays zu erweitern, wenn es seine Kapazität trifft.

Was Sie wirklich wollen, verwenden ist eine generische Liste wie List<T>. Dies hat alle Vorteile von Array und Arraylisten. Es ist stark typisiert und unterstützt eine variable Länge von Elementen.

Andere Tipps

Neben Bob und Friedrichs Antwort, würde ich es gerne darauf hinweisen, dass während Arrays Kovarianz haben, generische Listen nicht. Zum Beispiel kann ein Array vom Typ MyChildClass[] leicht zu MyParentClass[] gegossen wird, während List<MyChildClass> nicht List<MyParentClass> gegossen werden kann, zumindest nicht direkt.

Wenn Sie Kovarianz benötigen, entweder Verwendung Arrays verwenden LINQ Cast () -Methode oder andere Mittel jedes Element zu werfen einzeln oder warten Sie auf C # 4 .

Ein anderer Gedanke ist hier Mutation; ein Array (T[]) vollständig änderbare, nicht geschützt werden können. List<T> bietet keine nützliche Erweiterung Punkte, aber Dinge wie Collection<T> (oder viele andere IList<T> Implementierungen) können Sie Code hinzufügen, zum Beispiel Artikel zu überprüfen, bevor sie hinzugefügt werden; Ebenso können Sie nur lesbar IList<T> Implementierungen haben, die für die Thread-Sicherheit nützlich ist, wo Unveränderlichkeit wünschenswert ist.

Ich neige dazu, Arrays zu verwenden, entweder in der internen Verfahren Logik (vielleicht als lokale Variable), als params Argumente, oder in einigen hochoptimierten Fällen, in denen ich die Länge der Elemente kennen, und ich kenne den Code wählt nicht zu mutieren (als Privat Feld). Other than that, List<T> etc neigen häufiger zu sein, da sie viel weniger Aufwand, wenn das Hinzufügen / Entfernen von Elementen.

Es sei denn, dass ein Teil des Codes ist absolut leistungskritische, Arraylist verwendet, ist völlig in Ordnung.

Noch besser ist es, wo immer Sie ArrayList verwenden, verwenden Sie die List<T> generische Sammlung statt. Es wird stärker typisiert als die ersteren.

Ich beantworte diese aus einer Java-Perspektive, aber es ist die gleiche grundlegende Frage. Sie sollten sich nicht schuldig fühlen höhere Abstraktionen verwenden. Immerhin sind Sie Strings statt char[] oder sogar byte[]? Ich würde vorschlagen, noch einen Schritt weiter zu gehen und die List Schnittstelle verwenden, wenn möglich. Der einzige Grund, einen Schritt zu gehen ist aus Leistungsgründen.

hat die höhere Sammlung Abstraktion Mit vielen Vorteilen. Sie können Dekorateure hinzufügen, um die Liste zu machen schreibgeschützt, macht es eine feste Größe, Einzelteile zu überprüfen, die Eingabe oder die Sammlung verlassen oder Ansichten verwenden (siehe GetRange in C # und subList in Java).

Übrigens sollte ein ArrayList immer auf einem primitiven Array basieren, sonst wird der Name ist falsch. Die Operationen werden in der Regel nur umgesetzt, wie man es erwarten würde, wenn eine primitive Array. Wenn eine verknüpfte Liste verwendet wird, in der Regel ist benannt nur, dass - LinkedList. Das ist auch ein Vorteil der Verwendung der Schnittstelle. Sie können später auf dem Herz über die verwendete Implementierung ändern

Es gibt ein paar Dinge, die die Verwendung von Sammlungen klobig machen. Ein Nachteil ist, dass die Sammlungen sind in der Regel auf Objekten basieren, und die Sprachen haben eine beträchtliche Lücke zwischen primitiven und Objekttypen. Die begrenzten Generika helfen nicht viel weiter. Dennoch empfehle ich die Sammlungen über Arrays, es sei denn sonst ein guter Grund.

Für primitive Werte Sie auch eine primitive Sammlung Bibliothek betrachten kann zum Beispiel GNU Trove . Sie wissen nicht, ob es etwas ähnliches für C #, though.

Fabulous Adventures In Coding ein Stück geschrieben hat Arrays etwas schädlich betrachtet. Es ist ein wirklich interessant zu lesen.

Gut für ein, wenn Sie eine bestimmte Art zu handhaben möchten, sollten Sie nicht eine Arraylist verwenden. Zum Beispiel, wenn Sie nur ein Array von Bytes erwarten, sollten Sie nur ein Array von Bytes übernehmen.

Nur wenn ich denke, würde man sogar mit einem Arraylist denken kann, ist statt Liste.

Die Größe des Arrays ist statisch, so dass, wenn Sie die Größe zur Design-Zeit wissen, Array. Es wird angenommen, schneller zu arbeiten, aber ich habe es selbst nicht getestet. Wenn Sie die Anzahl der Objekte häufig ändern müssen (das Hinzufügen oder Objekte aus der Sammlung zu entfernen) verwenden Arraylist oder besser die allgemeine Liste von .NET 2. Es ist auch einfacher zu bedienen, so dass, wenn die Leistung nicht entscheidend ist, können Sie immer Liste verwenden.

Wenn Sie eine Reihe von primitiven Typen benötigen verwenden Array für eine bessere Leistung, da es Autoboxing und Unboxing zu vermeiden. Aber nur, wenn Sie die Größe, die Sie vor der Zeit.

Es ist wie diese.

using System;
using System.Collections;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            //ArrayList
            /*
             An ArrayList doesn't use a LinkedList as the internal data structure! .we can store any type of objects      
             */
            ArrayList list = new ArrayList();
            list.Add("1"); // not strongly type,you can enter any object types (int,string decimals, etc..)
            list.Add(1);
            list.Add(1.25);

            //Array
            /*
             must declare length.
             */
            string[] array = new string[3]; // you must declare object types
            array[0] = "1";
            //array[1] = 1; this get error becoz array is storngly typed. // this print empty value when you run it
            array[2] = "stongly typed";
            Console.WriteLine("------- ARRAYLIST ITEMS ---------");
            foreach (var i in list) {
                Console.WriteLine(i);
            }

            Console.WriteLine("--------- ARRAY ITEMS -----------");
            foreach (var i in array)
            {
                Console.WriteLine(i);
            }

            Console.ReadKey(); 
        }
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top