2 Stimmen

Ist es besser, ein benutzerdefiniertes Java-Objekt zu verwenden oder eine HashMaps zum Speichern von Daten zu verwenden?

Sagen wir, wir haben ein Bündel von Daten (Temp, Wind, Druck), die letztlich in als eine Reihe von Float-Arrays kommt. Zum Beispiel:

float[] temp = //get after performing some processing (takes time)
float[] wind = 

Angenommen, wir wollen diese Werte für verschiedene Stunden des Tages im Speicher ablegen. Ist es besser, diese in einer HashMap wie zu speichern:

HashMap maphr1 = new HashMap();
maphr1.put("temp",temp);
maphr1.put("wind",wind);
...

Oder ist es besser, ein Java-Objekt zu erstellen wie:

public class HourData(){

  private float[] temp,wind,pressure;

  //getters and setters for above!

}
...
// use it like this
HourData hr1 = new HourData();
hr1.setTemp(temp);
hr1.setWind(wind);

Welcher dieser beiden Ansätze ist besser in Bezug auf Leistung, Lesbarkeit, gute OOP-Praxis usw.

6voto

Mansoor Siddiqui Punkte 20061

Am besten ist es, wenn Sie eine HourData Klasse, die eine einzeln eine Reihe von Temperatur-, Wind- und Druckwerten, etwa so:

public class HourData {
    private float temp, wind, pressure;
    // Getters and setters for the above fields
}

Wenn Sie mehr als einen Satz von Werten speichern müssen, können Sie ein Array oder eine Sammlung von HourData Objekte. Zum Beispiel:

HourData[] hourDataArray = new HourData[10000];

Dies ist letztlich viel flexibler, leistungsfähiger und intuitiver als die Speicherung der Datenfelder in der Klasse HourData.

Flexibilität

Ich behaupte, dass dieser Ansatz flexibler ist, weil er die Wahl der Art der zu verwendenden Sammlungsimplementierung (z. B. ArrayList , LinkedList usw.) an die Nutzer des HourData Klasse. Wenn er/sie nur mit einem einzigen Satz von Werten arbeiten möchte, ist er/sie bei diesem Ansatz nicht gezwungen, mit einem Array oder einer Sammlung zu arbeiten.

Leistung

Angenommen, Sie haben eine Liste von HourData Instanzen. Wenn Sie drei Float-Arrays auf die von Ihnen beschriebene Weise verwendet haben, dann ist der Zugriff auf die i'th temp , wind y pressure Werte können zu drei verschiedenen Seiten auf die im Speicher zugegriffen werden soll. Dies geschieht, weil alle der temp Werte werden zusammenhängend gespeichert, gefolgt von allen wind Werte, gefolgt von allen pressure Werte. Wenn Sie eine Klasse verwenden, um diese Werte zu gruppieren, wird der Zugriff auf den i-ten temp , wind y pressure Werte sind schneller, weil sie alle nebeneinander im Speicher abgelegt werden.

Intuitiv

Wenn Sie eine HashMap Jeder, der auf eines der Felder zugreifen möchte, muss die Feldnamen im Voraus kennen. HashMap Objekte eignen sich besser für Schlüssel/Wert-Paare, bei denen die Schlüssel zur Kompilierungszeit nicht bekannt sind. Die Verwendung eines HourData Klasse, die klar definierte Felder enthält, braucht man nur einen Blick auf die Klassen-API zu werfen, um zu wissen, dass HourData enthält Werte für temp , wind y pressure .

Auch die Getter- und Setter-Methoden für Array-Felder können verwirrend sein. Was, wenn ich nur einen einzelnen Satz von temp , wind y pressure Werte in die Liste aufnehmen? Muss ich jedes der Arrays abrufen und die neuen Werte an das Ende der Arrays anhängen? Diese Art von Verwirrung lässt sich leicht vermeiden, indem man eine "Wrapper"-Sammlung um eine HourData die nur mit Einzelwerten arbeitet.

0voto

Manish Singh Punkte 3311

Sie haben eine Reihe von Daten erwähnt, daher würde ich es eher als Sammlung von Daten lesen.

Also die Antwort ist, wenn etwas bereits in Java Sammlung Rahmen out of box, warum wollen Sie eine für Sie zu schreiben.

Sie sollten sich die Java-Sammlungsklassen ansehen und sehen, welche Ihren Anforderungen besser entspricht, sei es gleichzeitiger Zugriff, schnelle Abrufzeit oder schnelle Hinzufügungszeit usw. usw.

Ich hoffe, das hilft

EDIT----

Diesem Thema wird eine weitere Dimension hinzugefügt.

Auch die Art der Anwendung, die Sie erstellen, beeinflusst Ihren Ansatz.

In der obigen Diskussion werden zu Recht Lesbarkeit, Flexibilität und Leistung als entscheidende Kriterien für Ihr Design genannt.

Aber die Art der Anwendung die Sie bauen, ist ebenfalls einer der beeinflussenden Faktoren.

Nehmen wir zum Beispiel an, Sie bauen eine Webanwendung.

Ein Objekt, das für längere Zeit im Speicher gehalten wird, befindet sich entweder im Anwendungs- oder im Sitzungsumfang. Daher müssen Sie es unveränderlich machen oder es für eine thread-sichere Weise verwenden.

Die Geschäftsdaten, die über verschiedene Implementierungen hinweg gleich bleiben, sollten gemäß OOP oder Best Practices entworfen werden, aber die Infrastruktur oder Anwendungslogik sollte eher von Ihrem Framework gesteuert werden.

Ich fühle, was Sie sprechen, wie ein Objekt für eine lange Zeit im Speicher zu halten ist mehr ein Rahmen angetrieben Aussicht, daher schlug ich Java Collection verwenden und setzen Sie Ihre Business-Objekte in es. Wichtige Punkte sind

  1. Gleichzeitige Zugangskontrolle
  2. Unveränderlich durch Design

0voto

Aus Gründen der Lesbarkeit würde ich mich definitiv für ein Objekt entscheiden, da es mehr Sinn macht. Vor allem, da Sie verschiedene datacollections wie die Wind-Longs speichern haben eine andere Bedeutung als die Temp-Longs.

Außerdem können Sie auch andere Informationen wie den Ort und die Uhrzeit Ihrer Messung speichern.

0voto

blessanm86 Punkte 30827

Nun, wenn Sie keinen Schlüssel haben, um verschiedene Instanzen des gleichen Objekts zu unterscheiden. Ich würde HourData-Objekte erstellen und sie in einer Array-Liste speichern.

Die Unterbringung von Daten in einem enthaltenen Objekt erhöht immer die Lesbarkeit.

0voto

default locale Punkte 12515

Wenn Sie eine begrenzte und bereits definierte Liste von Parametern haben, ist es besser, den zweiten Ansatz zu verwenden.

  1. In Bezug auf die Leistung: Sie müssen nicht nach dem Schlüssel in der Hashmap suchen
  2. Was die Lesbarkeit betrifft: data.setTemp(temp) ist besser als map.put("temp", temp) . Einer der Vorteile des ersten Ansatzes ist, dass Tippfehler während der Kompilierung abgefangen werden
  3. In Bezug auf gute OOP-Praktiken: Der erste Ansatz hat nichts mit OOP-Praktiken zu tun. Mit dem zweiten Ansatz können Sie die Implementierung leicht ändern, neue Methoden hinzufügen, mehrere alternative Datenobjektimplementierungen bereitstellen usw.

Sie sollten jedoch Sammlungen verwenden, wenn Sie die Parameter nicht kennen und wenn Sie mit nicht kategorisierten (erweiterbaren) Parametern arbeiten möchten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X