[JAVA] Wenn Sie es wagen, Integer mit "==" zu vergleichen ...

Was ist, wenn Sie überprüfen möchten, ob die Integer-Werte gleich sind? Anstatt "==" zu verwenden, verwenden Sie zum Vergleich natürlich die Methode "equals". Denn in Java bedeutet "==", zu überprüfen, ob die Instanzen, auf die in der Referenz verwiesen wird, identisch sind, und zu überprüfen, ob die Werte der Instanzen mit der Methode "equals" gleich sind. Deshalb.

Was ist, wenn Sie es wagen, "==" zu verwenden, um die Werte von Integer-Instanzen zu vergleichen? Siehe den Code unten.

Sample.java


public class Sample1 {

	public static void main(String[] args) {

		Integer i1 = 100;
		Integer i2 = 100;

		Integer i3 = 1000;
		Integer i4 = 1000;

		System.out.println("100=100: " + (i1 == i2));
		System.out.println("1000=1000: " + (i3 == i4));
	}
}

In diesem Programm werden "100" und "1000" mit "==" verglichen, aber die Ergebnisse werden wie folgt angezeigt.

100=100: true
1000=1000: false

Das Ergebnis war je nach den verglichenen Zahlen unterschiedlich. Warum macht das einen Unterschied?

** Wie Sie in den Kommentaren sehen können, liegt dies daran, dass bei IntegerCache Integer-Instanzen zwischengespeichert sind. Da es nichts mit dem konstanten Pool zu tun hat, werden wir es korrigieren. ** ** **

~~ Um dies zu erklären, muss zunächst der "konstante Pool" erklärt werden, der einer der Bereiche von Java ist. ~~

Was ist ein konstanter Pool?

Instanzen von ~~ Integer können ihren internen Status nicht ändern. Es ist unveränderlich. Daher können Sie die Instanzen wiederverwenden, und es ist sinnlos, jedes Mal eine Instanz zu erstellen. Daher erstellt Java VM diese Instanzen im Voraus, speichert sie in einem bestimmten Bereich im Speicher und verwendet sie bei Bedarf. Dieser Bereich wird als "konstanter Pool" bezeichnet. ~~

~~ Ebenso gibt es neben Integer noch andere Dinge, die diesem konstanten Pool unterliegen. Beispielsweise ist eine fest im Quellcode geschriebene Zeichenfolge auch ein Ziel, für das diesem konstanten Pool eine Instanz zugewiesen ist. ~~

Instanzen, die im konstanten Pool gespeichert werden sollen

~~ Wie oben erwähnt, wird die Integer-Instanz im Voraus im Konstantenpool vorbereitet, und das Programm verwendet diese Instanz. Warum macht der obige Code einen Unterschied zwischen "100" und "1000"? Dies liegt daran, dass sich nicht alle Integer-Instanzen in einem konstanten Pool befinden. Standardmäßig werden Integer-Instanzen im Bereich von -128 bis 127 als Ziel ausgewählt, und Instanzen außerhalb dieses Bereichs werden nicht im Konstantenpool bereitgestellt. ~~

~~ Mit anderen Worten, da im obigen Code die aus dem Konstantenpool erhaltene Instanz für "100" verwendet wird, war die Instanz, auf die jede Referenz zeigt, dieselbe. Für "1000" wurde jedoch jedes Mal eine Instanz erstellt, da die Instanz nicht im konstanten Pool vorbereitet wurde, und die Instanz, auf die in jeder Referenz verwiesen wird, war unterschiedlich, und als Ergebnis wurde das Ergebnis des Vergleichs mit "==" falsch. Es bedeutet, dass es war. ~~

Zusammenfassung

Als kleine Geschichte von Java habe ich im Training für Neulinge darüber gesprochen und es war gut, also habe ich es geschrieben.

Recommended Posts

Wenn Sie es wagen, Integer mit "==" zu vergleichen ...
Vergleiche Integer mit ==
Wenn Sie Mockito mit Kotlin verwenden möchten, verwenden Sie Mockito-Kotlin
Wagen Sie es, Kaggle mit Java herauszufordern (1)
Was tun, wenn Sie sich über OpenSSL mit pyenv install ärgern?
[Rails] Was tun, wenn Sie mit form_with keine Parameter abrufen können?
[Java] Fassen Sie zusammen, wie Sie mit der Methode equals vergleichen können
Wenn Sie mit Ruby eine Zip-Datei erstellen möchten, ist dies Rubyzip.
Wenn Sie Datenbankspalten usw. ändern möchten.
Sie verwenden den Kontext, um MDC mit Spring WebFlux zu verwenden
Was tun, wenn Sie falsche Informationen eingeben?
Wenn Sie mit Ajax null auf Servlet werfen, wird es in leer "" konvertiert.
Wenn Sie SQLite mit VSCode verwenden, verwenden Sie die Erweiterung (wie die Binärdatei von sqlite3 angezeigt wird)
Was tun, wenn Sie den Befehl "Java-Paketname / Klassenname" nicht ausführen können?
Wenn Sie die Spring Boot + Thymeleaf-Verarbeitung trennen möchten
Was tun, wenn Sie versehentlich ein Modell erstellen?
[Java] [Spring] Was tun, wenn Sie nach dem Kommentieren von Spring Security nicht automatisch mit Type Mismatch verdrahten können?
Was tun, wenn Sie die Listen-Adresse im Einstellungsbildschirm des Dockers Mattermost ändern?
Was tun, wenn Sie Ruby mit rbenv installiert haben, die Version sich jedoch nicht ändert?
10 Entspricht der if-Anweisung
[Schienen] Was tun, wenn mit der Fehlermethode keine Fehlermeldung angezeigt wird?
Notiz, die zum Anmeldebildschirm übergeht, wenn Sie nicht mit devise angemeldet sind
Was tun, wenn in GlassFish eine java.io.IOException auftritt?
Wenn Sie Programmieren an der Universität studieren möchten, gehen Sie nach Australien
[# 3 Java] Lesen Sie dies, wenn Sie Java lernen möchten! ~ Sorgfältig ausgewählt ~
Wenn Sie explizit ODER oder UND mit Ransack schreiben möchten
docker-compose.yml, wenn Sie MySQL auf Docker laufen lassen möchten
Stellen Sie sicher, dass Sie das Java compareTo-Ergebnis mit 0 vergleichen
lombok.config, wenn Sie @Qualifier mit lombok an @RequiredArgsConstructor übergeben möchten
[Organisation] Für Sie, die mit render & redirect_to durcheinander geraten
Was tun, wenn der Befehl Rails unbrauchbar wird?
Sie müssen winpty mit Docker Exec [Windows] verwenden.