2017-08-01 3 views
12

Was ist der Unterschied zwischen der Verwendung eines List<Map<String, String>> vs List<Object> in Bezug auf Nutzung und Leistung. Angenommen, ich muss eine Liste mit Karten erstellen, die nur drei Arten von Schlüsselwertpaaren haben, kann stattdessen ein Objekt mit nur drei Eigenschaften erstellen und eine Liste von Objekten erstellen.Liste <Map <String, String >> vs Liste <Object>

Die Frage hier ist von den zwei Ansätzen, die man in welchem ​​Szenario verwenden sollte?

+0

Warum wurde die Frage erneut geöffnet? Es ist immer noch meinungsbezogen. –

+0

@MuratK. Man kann die objektiven (d. H. Nicht auf Meinungen basierenden) Unterschiede in Bezug auf Syntax und Leistung betrachten, wenn sie für verschiedene Szenarien verwendet werden. Aber das Ganze "welches ich verwenden soll" tendiert dazu, eine meinungsbasierte Best Practice zu sein und würde wahrscheinlich besser zu [softwareengineering.se] passen. Es scheint, als könnte es in beide Richtungen gehen. – Dukeling

Antwort

26

Lets klären zuerst, was wir reden: es

List<Map<String, String>> 

gegen

List<Foo> 

wo Foo Objekte eine Reihe von „Eigenschaften“ ist haben, die in einer Karte gespeichert werden würde (wie Schlüsselwertpaare) mit Option eins.

In diesem Fall gehen Sie absolut für die Option zwei. Einfach weil gute OOP über das Erstellen von Abstraktionen, auch bekannt als Modelle. Das heißt: Wenn Sie Attribute haben, die zusammen gehören, dann eine Klasse zu verwenden, um sie zu wickeln, ist der natürliche Weg zu gehen.

Das gibt Ihnen leichte Vorteile in Bezug auf die Leistung (weil Sie den Kartenzugriff vermeiden), aber das Wichtigste ist: es ermöglicht Ihnen, kompilieren Zeit checked code schreiben. Sie sehen:

int foo = list.get(0).map.get("key"); 

bei Laufzeit fehlschlagen kann - Sie wissen nicht, ob Karte den Schlüssel enthält, und wenn das eine ganze Zahl.

Aber

int foo = list.get(0).getFoo(); // resp. ...get(0).fieldName 

kann vom Compiler überprüft werden! (Ja, diese get() Anrufe können noch während der Laufzeit nicht, aber das ist etwas, das Sie bekommen um nicht sowieso)

Darüber hinaus: nicht Sorge über die Leistung auf dieser Ebene: erstens, Sie müssen verstehen, was wirklich betrifft Ihre Leistung beim Schreiben von Java-Code. Weil Sie unbedingt vermeiden wollen, dass "dieser Code hässlich ist, aber vielleicht bessere Leistung bringt", schleichen sich Gedanken in Ihr Design ein. Konzentrieren Sie sich auf das Schreiben von sauberem Code, der die Arbeit auf unkomplizierte Weise erledigt. Do nie schreiben weniger ausdrucksvoll code, weil Sie davon ausgehen, es ist schneller. Wenn Sie ein Leistungsproblem haben - profilieren Sie Ihren Code, identifizieren Sie die Ursache und beheben Sie diese.

Aber lassen Sie keine vorzeitigen Optimierungsgedanken auf die Qualität Ihres Codes auswirken.

+0

ein kleiner Start in den Tag! – davidxxx

4

Klasse bereitgestellt sieht ungefähr so ​​aus:

class Foo 
{ 
    private final String a; 
    private final String b; 
    private final String c; 

    // constructor and getters 
} 

Mit einem List<Foo> würde zu:

Leistung

Leistung einer Klasse mit auf einer Karte wahrscheinlich sehr ähnlich ist. Die meisten Kartenimplementierungen, zum Beispiel HashMap, stellen O (1) und setzen Operationen bereit. Es wird nicht wesentlich langsamer als das Aufrufen einer Getter-Methode für Ihr Objekt.

Verwendung, wenn die drei „Schlüssel“ sind immer die gleichen:

Die Klasse ist wahrscheinlich viel einfacher zu bedienen. Wenn Sie eine Map<String, String> haben, gibt es keine einfache Möglichkeit, zu erzwingen, dass jede Karte genau 3 Schlüssel "A", "B" und "C" enthält. Was passiert, wenn jemand den Schlüssel "D" hinzufügt? Was ist, wenn jemand den Schlüssel A entfernt?

Mit einer benutzerdefinierten Klasse ist dies einfach durch den Konstruktor durchzusetzen - eine Kompilierzeitprüfung.

Verwendung, wenn die drei „Schlüssel“ sind nicht das gleiche:

Ohne mehrere Klassen aufweisen und möglicherweise eine Art Klassenhierarchie, können Sie nicht einfach dies erreichen. Eine Karte ist wahrscheinlich besser.

Verwandte Themen