JVM-Optimierungen

Status
Nicht offen für weitere Antworten.

chriga

Neues Mitglied
Hallo,

ich möchte ein Tabellen-Objekt erstellen. Dabei stellt sich mir die Frage, ob ich es über eine Map oder zwei Listen implementieren soll.

Im ersten Fall hätte ich List<Map<Object, Object>>. Jede Map entspricht einer Zeile. Schlüssel sind die Spaltennamen.

Im zweiten Fall List<List<Object>> und List<Object>. Die erste Liste enthält die Werte, die zweite Liste die Spaltennamen, die ich jedes mal durchsuchen müsste, um dann mit dem Index auf den Wert zuzugreifen.

Die Zugriffszeit im ersten Fall ist mit O(1) konstant und damit besser als im zweiten Fall O(n) linear.

Ich möchte aber den Platzbedarf optimieren, im ersten Fall wäre dies O(n*m), n Zeilen und m Spalten. Im zweiten Fall O(n) und damit wieder linear.

Mich würde es interessieren, ob jemand weiß, ob die JVM im ersten Fall eine Optimierung vornimmt, sodass der Platzbedarf auch auf O(n) sinkt. Es sind ja immer die gleichen Schlüssel, die für jede Zeile verwendet werden. Die Schlüssel könnten also für alle Zeilen auf immer ein Objekt verweisen. Weiß vielleicht jemand, ob das so ist???
 

Wildcard

Top Contributor
chriga hat gesagt.:
Es sind ja immer die gleichen Schlüssel, die für jede Zeile verwendet werden. Die Schlüssel könnten also für alle Zeilen auf immer ein Objekt verweisen. Weiß vielleicht jemand, ob das so ist???
Wenn du immer den selben Schlüssel in die Maps packst, dann ist es immer das selbe Objekt
 

chriga

Neues Mitglied
Wie ist es mit den Objekten an sich? Verbraucht eine HashMap mehr Speicher als eine ArrayList? Irgendwo muss ja auch der Vorteil einer ArrayList stecken.
 

Marco13

Top Contributor
(Das mit den "Zugriffszeiten" (in O-Notation) ist so eine Sache - eigentlich machen solche Angaben nur Sinn für bestimmte "Operationen" (du gehst jetzt davon aus, dass du einen Spaltennamen hast, und den passenden Wert haben willst - das aber für eine bekannte Zeilennummer... man muss sich eben überlegen, wie man darauf zugreifen will.)

Aber zur eigentlichen Frage: Das ist egal. (Oder sollte egal sein). Schreib' dir (wenn du da nicht schon was vorgefertigtes verwenden willst) ein interface "Table", das ZUM BEISPIEL(!!!) so aussehen könnte
Code:
interface Table<K, V> 
{
    V get(int row, K key);

    // add, remove, was auch immer...
}

und dann zwei Implementierungen dafür
Code:
class ListTable<K,V> implements Table<K, V> 
{
    List<List<Object>>  values = ...
    List<Object> keys = ...

    V get(int row, K key) { ...  }
}
und
Code:
class MapTable<K,V> implements Table<K, V> 
{
    List<Map<Object, Object>> data = ...

    V get(int row, K key) { ...  }

}
und dann schau nach (ggf. mit einem Profiler) was für deinen Anwendungsfall besser ist.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben