Różnica w deklaracji obiektów

0

Cześć

Jaka jest różnica po między tymi dwoma zapisami:

 		Integer x = new Integer(10);
		Integer x = 10;

W obu przypadkach z tego co rozumiem korzystam z obiektów Integer, jaka jest różnica między tymi dwoma zapisami?
W pierwszym deklaruję zmienną obiektową x i ją tworzę, a w drugim tylko deklaruję? Jakie to ma konsekwencje?

1

W obydwu przypadkach deklarujesz zmienną typu Integer i w obydwu przypadkach przypisujesz do niej referencję do obiektu typu Integer. W pierwszym przypadku jawnie korzystasz z konstruktora i za pomocą słowa new tworzysz nowy obiekt a w drugim przypadku korzystasz z czegoś co nazywa się autoboxing - ponieważ próbujesz przypisać typ prymitywny do zmiennej obiektowej kompilator "za Ciebie" opakowuje ją w obiekt odpowiedniego typu. Z tym, że kompilator wykorzysta tutaj konstrukcję: Integer.valueOf(10);a nie bezpośrednio konstruktor. Rezultat jest taki, że dla małych wartości obiekty klasy Integer są cachowane, więc nie otrzymasz nowej instancji. W konsekwencji dwukrotne użycie konstrukcji Integer x = 5; spowoduje, że dwa razy przypisana zostanie referencja do tego samego obiektu.

Na podobnej zasadzie działa tworzenie Stringów poprzez String a = "cachedString"; Jeżeli gdzieś w kodzie dwa razy przypiszesz identyczny napis do zmiennej nie używając operatora new to obydwie zmienne będą wskazywały na ten sam obiekt.

Dla komentarza kawałek kodu:

		
		Integer x = 10;
		Integer x1 = 10;
		Integer y = new Integer(10);
		Integer y1 = new Integer(10);		
		
		System.out.println(x==x1); //true !!!
		System.out.println(x==y); //false
		System.out.println(y==y1); //false
		
		System.out.println(x.equals(x1)); //true
		System.out.println(x.equals(y)); //true
		System.out.println(y.equals(y1)); //true
		
		Integer a = 129;
		Integer a1 = 129;
		Integer b = new Integer(129);
		Integer b1 = new Integer(129);		
		
		System.out.println(a==a1); //false
		System.out.println(a==b); //false
		System.out.println(b==b1); //false
		
		System.out.println(a.equals(a1)); //true
		System.out.println(a.equals(b)); //true
		System.out.println(b.equals(b1)); //true	

	
0

@dymul: Mógłbyś wyjaśnić czemu w 2 przykładzie a != a1?

1

Zaprawdę powiadam Ci: Dokumentacja prawdę Ci powie :) https://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html#valueOf(int)

Wartości powyżej 127 nie są już cachowane - przynajmniej w tej implementacji, z której korzystam. W konsekwencji niejawne wywołanie Integer.valueOf(129) również powoduje utworzenie nowego obiektu, a skoro jest nowy obiekt to porównanie za pomocą == zwraca false.

0

@dymul:
Świetnie wytłumaczone, bardzo Ci dziękuję.
Nie wiedziałem, że tak jak podałeś w drugim przykładzie chodzi o ograniczenie wynikające z poola (powyżej 127 nie korzysta z poola i tworzy nowy obiekt).

1 użytkowników online, w tym zalogowanych: 0, gości: 1