Zwischenspeichern von Ganzzahlen in Java [duplicate]

Lesezeit: 3 Minuten

Zwischenspeichern von Ganzzahlen in Java duplicate
Beresta

Mögliches Duplikat:

Seltsames Java-Boxen

Kürzlich sah ich eine Präsentation, in der das folgende Beispiel von Java-Code war:

Integer a = 1000, b = 1000;  
System.out.println(a == b); // false  
Integer c = 100, d = 100;  
System.out.println(c == d); // true

Jetzt bin ich etwas verwirrt. Ich verstehe, warum das Ergebnis im ersten Fall “false” ist – es liegt daran, dass Integer ein Referenztyp ist und die Referenzen von “a” und “b” unterschiedlich sind.

Aber warum ist das Ergebnis im zweiten Fall “wahr”?

Ich habe eine Meinung gehört, dass JVM Objekte für int-Werte von -128 bis 127 für einige Optimierungszwecke zwischenspeichert. Auf diese Weise sind die Referenzen von “c” und “d” gleich.

Kann mir jemand nähere Informationen zu diesem Verhalten geben? Ich möchte die Zwecke dieser Optimierung verstehen. In welchen Fällen wird die Leistung erhöht usw. Verweise auf einige Untersuchungen zu diesem Problem werden großartig sein.

  • Sie sollten beachten, dass Sie keinen Code schreiben können, der von diesem Verhalten abhängt, da andere JVM/JDK-Implementierer diese Optimierung nicht implementieren müssen oder, wenn sie möchten, den Bereich der zwischengespeicherten Werte erweitern können.

    – Behrang

    28. Juni 2010 um 11:03 Uhr

  • Beachten Sie, dass das Caching nicht für explizit erstellte Objekte gilt. Dh Integer a = 1; Integer b = new Integer(1); System.out.println(a == b); // prints false

    – ccpizza

    15. Dezember 2015 um 21:25 Uhr


  • @ccpizza Es gilt offensichtlich nicht für explizit erstellte Objekte, da das JLS garantiert, dass nach jedem neuen Operatoraufruf eine neue Speicheradresse zugewiesen und zurückgegeben wird.

    – Toni Nagy

    26. März 2021 um 20:11 Uhr

Ich möchte die Zwecke dieser Optimierung verstehen. In welchen Fällen wird die Leistung erhöht usw. Verweise auf einige Untersuchungen zu diesem Problem werden großartig sein.

Der Zweck besteht hauptsächlich darin, Speicher zu sparen, was aufgrund einer besseren Cache-Effizienz auch zu schnellerem Code führt.

Grundsätzlich die Integer Klasse hält einen Cache von Integer Instanzen im Bereich von -128 bis 127 und alle Autoboxing, Literale und Verwendungen von Integer.valueOf() gibt Instanzen aus diesem Cache für den Bereich zurück, den er abdeckt.

Dies basiert auf der Annahme, dass diese kleinen Werte viel häufiger vorkommen als andere Ints und es daher sinnvoll ist, den Overhead zu vermeiden, für jede Instanz unterschiedliche Objekte zu haben (an Integer Objekt nimmt ungefähr 12 Bytes ein).

  • Beachten Sie, dass der Cache nur funktioniert, wenn Sie Auto-Boxing oder die statische Methode Integer.valueOf() verwenden. Der Aufruf des Konstruktors führt immer zu einer neuen Integer-Instanz, auch wenn der Wert dieser Instanz im Bereich von -128 bis 127 liegt.

    – Tim Bender

    28. Juni 2010 um 10:52 Uhr

  • Kann sich jemand dieses Phänomen erklären? ideone.com/DAI75m – warum werden zwei voneinander verschiedene kleine Werte (< 128) als "ungleich" deklariert? Da sie beide zwischengespeichert sind, sollten sie nicht zu derselben Integer-Instanz gehören und daher würde "==" wahr zurückgeben, da ihre Referenzen verglichen werden?

    – David Doria

    8. Februar 2013 um 15:42 Uhr

  • @ David Doria: Sie scheinen ernsthafte Missverständnisse darüber zu haben, was eine “Instanz” ist. Es ist grundsätzlich unmöglich, dass zwei verschiedene Werte “zur selben Integer-Instanz gehören”. Eine Objektinstanz ist im Grunde ein Speicherbereich. Sie können mehrere verschiedene Instanzen mit demselben Wert haben, aber nicht umgekehrt. Der Cache gibt unterschiedliche Instanzen für unterschiedliche Werte zurück; Es stellt nur sicher, dass Sie immer dieselbe Instanz für denselben Wert erhalten.

    – Michael Borgwardt

    8. Februar 2013 um 15:52 Uhr

  • @MichaelBorgwardt Ah verstehe, danke.

    – David Doria

    8. Februar 2013 um 20:01 Uhr

  • @MichaelBorgwardt könnten Sie auf eine Quelle der Caching-Informationen verweisen. Vielleicht JLS?

    – Olimpiu POP

    27. August 2014 um 9:33 Uhr

Zwischenspeichern von Ganzzahlen in Java duplicate
dty

Sehen Sie sich die Implementierung von an Integer.valueOf(int). Es wird dasselbe zurückgeben Integer Objekt für Eingaben kleiner als 256.

BEARBEITEN:

Es ist eigentlich -128 zu +127 standardmäßig wie unten angegeben.

  • Tatsächlich ist der Standardbereich -128 <= i <= 127. Es scheint eine Systemeigenschaft (java.lang.Integer.IntegerCache.high) zu geben, die den maximalen Wert einer Ganzzahl beeinflussen kann, die zwischengespeichert werden soll.

    –Andreas

    28. Juni 2010 um 9:13 Uhr

  • Ja. Entschuldigung, -128 bis +127. Der Punkt ist jedoch, dass kleine Werte von i zwischengespeichert werden!

    – dty

    28. Juni 2010 um 9:21 Uhr

  • Eine ausführlichere Antwort finden Sie unter stackoverflow.com/a/64837154/6073148

    – Zahid Khan

    14. November 2020 um 18:55 Uhr

894740cookie-checkZwischenspeichern von Ganzzahlen in Java [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy