Hallo liebe Leute,
anbei eine ganz allgemeine Frage zu Speicherverwaltung:
Ich habe ein großes Programm in dem ich eine Menge Daten in vielen Objekten speichere, wodurch ich zu dem Schluss gekommen bin Integer, Boolean, Double usw. statt primitive Datentypen zu nehmen. Jetzt habe ich mir Gedanken über die Speicherverwaltung gemacht und folgendes Beispiel ausgepackt:
Mein Fazit daraus war, dass es so ähnlich wie bei String und String Interning ist und man grundsätzlich auf new verzichten sollte, um Speicherplatz zu sparen. Dann habe ich das Gleiche allerdings mit Double probiert:
Joar, das war dann natürlich enttäuschend, weil das Double a1 und c1 an unterschiedlichen Stellen gespeichert wird und damit heap verschwendet wird (es sei denn ich setze es explizit gleich). Die JVM-Maschine erkennt die Gleichheit also nicht. Dementsprechend ist es doch eigentlich wurst ob ich bei Double ein new hinsetze oder nicht?
Stimmen meine Überlegungen soweit?
Danke
Grüße
PanchoVarallo
anbei eine ganz allgemeine Frage zu Speicherverwaltung:
Ich habe ein großes Programm in dem ich eine Menge Daten in vielen Objekten speichere, wodurch ich zu dem Schluss gekommen bin Integer, Boolean, Double usw. statt primitive Datentypen zu nehmen. Jetzt habe ich mir Gedanken über die Speicherverwaltung gemacht und folgendes Beispiel ausgepackt:
Java:
System.out.println("Integer: ");
Integer a5 = 2;
Integer b5 = new Integer(2);
Integer c5 = 2;
System.out.println(System.identityHashCode(a5)); // 544359254
System.out.println(System.identityHashCode(b5)); // 765645758
System.out.println(System.identityHashCode(c5)); // 544359254
System.out.println(a5 == b5); // false
System.out.println(a5 == c5); // true
System.out.println("Boolean: ");
Boolean a6 = true;
Boolean b6 = new Boolean(true);
Boolean c6 = true;
System.out.println(System.identityHashCode(a6)); // 486241882
System.out.println(System.identityHashCode(b6)); // 1092033939
System.out.println(System.identityHashCode(c6)); // 486241882
System.out.println(a6 == b6); // false
System.out.println(a6 == c6); // true
Mein Fazit daraus war, dass es so ähnlich wie bei String und String Interning ist und man grundsätzlich auf new verzichten sollte, um Speicherplatz zu sparen. Dann habe ich das Gleiche allerdings mit Double probiert:
Java:
System.out.println("Double: ");
Double a1 = 1.0;
Double b1 = new Double(1.0);
Double c1 = 1.0;
Double d1 = a1;
System.out.println(System.identityHashCode(a1)); // 402081892
System.out.println(System.identityHashCode(b1)); // 1806805382
System.out.println(System.identityHashCode(c1)); // 1559286694
System.out.println(System.identityHashCode(d1)); // 402081892
System.out.println(a1 == b1); // false
System.out.println(a1 == c1); // false
System.out.println(a1 == d1); // true
Joar, das war dann natürlich enttäuschend, weil das Double a1 und c1 an unterschiedlichen Stellen gespeichert wird und damit heap verschwendet wird (es sei denn ich setze es explizit gleich). Die JVM-Maschine erkennt die Gleichheit also nicht. Dementsprechend ist es doch eigentlich wurst ob ich bei Double ein new hinsetze oder nicht?
Stimmen meine Überlegungen soweit?
Danke
Grüße
PanchoVarallo