equals() und ==

tuttle64

Bekanntes Mitglied
Als SCJP-Student sind mir die Unterschiede von equals() und == wohl bekannt. Beim Testen habe ich folgenden Code laufen lassen:

Code:
public class IntegerExampe {

	public static void main(String[] args) {
		Integer i1 = 5;
		Integer i2 = 5;
		Double d1 = 1.0;
		Double d2 = 1.0;
		System.out.println(i1==i2);
		System.out.println(d1==d2);
	}
}

Nun, i1==i2 liefert true, aber d1==d2 liefert false, Float liefert ebenfalls false. Kann mir jemand auf die Sprünge helfen, weshalb der Vergleich mit String, Integer, Byte etc. true liefert aber mit Double und Float false? Korrekterweise sollten Vergleiche auf den Inhalt stets mit überschriebener equals()-Methoden erfolgen. Dennoch hätte ich gerne eine Begründung für mein false-Problem.
 

BlackViruZ

Aktives Mitglied
eine Range an Integer Objekten (-127 bis 127 wars glaub ich) wird von der JVM in einem Pool gehalten, wenn du ein neues Integer Objekt in dieser Range durch auto boxing erstellst wird statt dessen das Objekt aus dem Pool genommen.

Bei Double und Float wird das nicht gemacht.

#EDIT:
Der pool ist -128 bis 127 (beides inclusive)

Autoboxing ist nicht die einzige Variante in der das Objekt aus dem Pool kommt, aber bei einer expliziten neuerstellung von einem Integer Objekt via new Operator wird eine neue Instanz erstellt und der pool ignoriert. (dachte das könnte noch ganz gut zu wissen sein..)
 
Zuletzt bearbeitet:

tuttle64

Bekanntes Mitglied
eine Range an Integer Objekten (-127 bis 127 wars glaub ich) wird von der JVM in einem Pool gehalten, wenn du ein neues Integer Objekt in dieser Range durch auto boxing erstellst wird statt dessen das Objekt aus dem Pool genommen.

Bei Double und Float wird das nicht gemacht.

Genau, das ist es! Vielen Dank. Wenn ich die Stelle im Buch finde, werde ich den ganauen Wortlaut nachliefern.
 
Zuletzt bearbeitet:
S

SlaterB

Gast
und Strings direkt im Quellcode werden vom Compiler gecacht,
werden sie mehrfach aus einem Textfeld, Netzwerk oder System.in gelesen oder char für char zusammengebaut sind sie normalerweise nicht ==

Java:
    /**
     * Returns a <tt>Integer</tt> instance representing the specified
     * <tt>int</tt> value.
     * If a new <tt>Integer</tt> instance is not required, this method
     * should generally be used in preference to the constructor
     * {@link #Integer(int)}, as this method is likely to yield
     * significantly better space and time performance by caching
     * frequently requested values.
     *
     * @param  i an <code>int</code> value.
     * @return a <tt>Integer</tt> instance representing <tt>i</tt>.
     * @since  1.5
     */
    public static Integer valueOf(int i) {
	final int offset = 128;
	if (i >= -128 && i <= 127) { // must cache 
	    return IntegerCache.cache[i + offset];
	}
        return new Integer(i);
    }
 

musiKk

Top Contributor
und Strings direkt im Quellcode werden vom Compiler gecacht

So ähnlich. Stringliterale werden in den Constantpool einer Klasse geschrieben. Zur Laufzeit müssen gleiche Literale durch gleiche Instanzen repräsentiert werden. Für dynamisch erzeugte Strings gilt dies nicht. Man kann eine solche Instanz aber durch [c]intern()[/c] erhalten.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
mihe7 equals und instanceOf pattern matching Allgemeine Java-Themen 9
P Strings: equals vs == Allgemeine Java-Themen 47
F Methoden hashCode() & equals() Allgemeine Java-Themen 13
J Equals Mock Objekte Allgemeine Java-Themen 5
J Mockito - Objekte miteinander vergleichen (equals) Allgemeine Java-Themen 6
J Probleme mit CodeCoverage und Lombok Equals Allgemeine Java-Themen 1
S equals-Methode bestimmer Klassen abfangen Allgemeine Java-Themen 2
T Zwei Wortendungen vergleichen ohne .equals Allgemeine Java-Themen 10
C Object.equals() liefert falschen Wert? Allgemeine Java-Themen 14
T Collections TreeSet.contains ruft nicht .equals? Allgemeine Java-Themen 4
H Problem mit der .equals()-Methode Allgemeine Java-Themen 2
T Compiler-Fehler not equals Allgemeine Java-Themen 22
I HashMap key wird nicht erkannt trotz überschriebener equals/hashCode Methode Allgemeine Java-Themen 6
V ArrayList vergleichen mit .equals? Allgemeine Java-Themen 13
A mit .equals Array befüllen schlägt teilweise fehl Allgemeine Java-Themen 3
G Probleme mit equals Allgemeine Java-Themen 3
R Merkwürdiges Verhalten der equals Method Allgemeine Java-Themen 4
B Probleme mit eigener equals Methode Allgemeine Java-Themen 18
H double dispatch und equals(Object) Allgemeine Java-Themen 6
S equals - Identität ändern bei Vererbung? Allgemeine Java-Themen 5
fastjack jUnit und Test von equals, hashCode, toString Allgemeine Java-Themen 11
K Collection.contains()/retainAll() mit Referenzgleichheit statt equals()? Allgemeine Java-Themen 2
J Best Practice für implementierung von equals(...) Allgemeine Java-Themen 7
M equals & compareTo Allgemeine Java-Themen 15
M Warum Strings mit equals vergleichen... Allgemeine Java-Themen 6
T Wie intelligent ist dieses überschriebene .equals() ? Allgemeine Java-Themen 13
G Objektvergleich mit equals Allgemeine Java-Themen 5
vogella Überschreiben von equals und hashcode für Collection Allgemeine Java-Themen 7
M String#equals(), Probleme mit großen Strings? Allgemeine Java-Themen 4
André Uhres equals überschreiben Allgemeine Java-Themen 31
F Problem: mehrere Interfaces definieren equals() neu Allgemeine Java-Themen 24
A equals() macht nicht, was es soll Allgemeine Java-Themen 4
B Equals Methode überschreiben mit Array Allgemeine Java-Themen 2
M equals() != compareTo() ? Allgemeine Java-Themen 3
M String mit equals() vergleichen - Frage Allgemeine Java-Themen 3
S equals überladen Allgemeine Java-Themen 15
S Mal was allgemeines zu equals() Allgemeine Java-Themen 12
J Arrays vergleichen mit equals Allgemeine Java-Themen 8

Ähnliche Java Themen

Neue Themen


Oben