Sobes.tech
Middle

Wat gebeurt er bij het vergelijken van Integer a = 127 en int b = 127, evenals Integer a1 = 128 en int b1 = 128 in Java? Leg uit waarom de resultaten van de vergelijking verschillend zullen zijn.

sobes.tech AI

Antwoord van AI

Bij het vergelijken van Integer a = 127 en int b = 127 met de operator ==, zal het resultaat true zijn. Dit komt door autoboxing (autoboxing) van int b naar een Integer object, en omdat de waarde 127 binnen het gecachte bereik van Integer objecten ligt (standaard van -128 tot 127). Java gebruikt een objectpool voor deze waarden, dus a en de verpakte b verwijzen naar hetzelfde object.

Bij het vergelijken van Integer a1 = 128 en int b1 = 128, zal het resultaat van == false zijn. Hoewel b1 ook automatisch wordt verpakt in een Integer object, ligt de waarde 128 buiten het cachebereik. Daarom wordt bij autoboxing een nieuw Integer object gemaakt voor b1. De referenties a1 en de verpakte b1 wijzen naar verschillende objecten op de heap, zelfs als hun numerieke waarden gelijk zijn.

Om de waarden van wrapper-objecten (zoals Integer) te vergelijken, moet je de methode equals() gebruiken.

// Waardevergelijking
Integer a = 127;
int b = 127;
System.out.println(a == b); // true (autoboxing en caching van Integer)
System.out.println(a.equals(b)); // true (waardevergelijking)

Integer a1 = 128;
int b1 = 128;
System.out.println(a1 == b1); // false (autoboxing, maar geen cache voor deze waarde)
System.out.println(a1.equals(b1)); // true (waardevergelijking)

Integer a2 = new Integer(127); // Nieuw object wordt gemaakt, zelfs als de waarde in cache ligt
Integer a3 = new Integer(127);
System.out.println(a2 == a3); // false (verschillende objecten)
System.out.println(a2.equals(a3)); // true (waardevergelijking)

Dus, == vergelijkt objectreferenties voor wrapper-typen, terwijl voor het vergelijken van primitieve types of wrapper-waarden, equals() moet worden gebruikt. De caching van Integer voor het bereik [-128, 127] beïnvloedt de uitkomst van == bij werken met getallen in dit bereik.