Wpis z mikrobloga

#javozagadka #java #programowanie

Kolejna zagadka:

Kod:
String qwerty = "qwerty";
int 12345 = 12345;
String qwerty12345v1 = "qwerty12345";
String qwerty12345v2 = "qwerty" + 12345;
String qwerty12345v3 = qwerty +
12345;

System.out.println(qwerty12345v1 == qwerty12345v2);
System.out.println(qwerty12345v2 == qwerty12345v3);

Pytanie:
1.Co się wypisze?
2.CZEMU się tak wypisze?
Odpowiedź tylko na pierwsze się nie liczy

Pytanie dodatkowe* (z gwiazdką):
Co zrobić żeby oba porównania dały "true"? Należy wymienić 2 (słownie dwa) sposoby aby to zrobić. NIE można modyfikować części kodu przed printami ani rażąco zmieniać logiki.
np. System.out.println(true) ani System.out.println(qwerty12345v1 == qwerty12345v1) nie będą się liczyć
Trudność polega na tym, że to nie mogą być losowe 2 sposoby, tylko dokładnie takie jakie sobie wymyśliłem. Jak macie więcej pomysłów niż 2, piszcie każdy

Dodatkowe zasady:
Nie robimy bruteforce'a w komentarzach z wszystkimi możliwymi rozwiązaniami licząc że któreś będzie prawidłowe.
Pierwsza prawidłowa odpowiedź - punkt (na prawidłową odpowiedź nie wystarczy strzelić w output, trzeba napisać czemu tak się stało)
Pierwsza prawidłowa odpowiedź na pytanie dodatkowe - punkt
Za zgarnięcie punktu za pytanie podstawowe i dodatkowe - bonus - 1 punkt

Czyli można zgarnąć 3, ale trzeba być pierwszym

Koniec zagadki - w zależności od ilości odpowiedzi - dzisiaj o 22.00 lub jutro o 10.00
  • 8
  • Odpowiedz
@mrowkojad04: Trochę strzelam, bo nie znam Javy.
1. Wypisze true false
2. Kompilator zoptymalizuje.
qwerty12345v2 będzie obliczone w czasie kompilacji, bo po prawej stronie przypisania mamy stałe. Stringi zostaną zebrane i zapamiętane w jednym miejscu, więc v1 i v2 będą wskazywały na ten sam adres w pamięci.
qwerty12345v3 po prawej stronie ma zmienne, więc nie zostanie obliczone w trakcie kompilacji.
*. Użyć metody Equals, a nie ==, albo porównywać hashCode()
  • Odpowiedz
1. true false
2. ponieważ v1 i v2 to string literals, wg java language specyfication "A string literal is always of type String" https://docs.oracle.com/javase/specs/jls/se8/html/jls-3.html#jls-3.10.5
jvm używa w przypadku string literals koncepcji string interning, więc referencje v1 i v2 będą wskazywać na ten sam obiekt. Natomiast w przypadku v3 będzie utworzony nowy obiekt ponieważ operator konkatancji wg specyfikacji zawsze tworzy nowy obiekt https://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html#jls-4.3.3

*
- 1 użycie metody equals
- 2 porównanie wyników
  • Odpowiedz
@boo007: @splatch: @GuardianOfTheBlind: @badAttitude:
Prawdiłowa odpowiedź:
true false, z tego powodu jaki napisał @badAttitude
@boo007 otrzymuje punkta, bo był pierwszy; @badAttitude też otrzymuje punkta, bo najbardziej mi się podoba jego wytłumaczenie czemu tak się dzieje i jak to działa

co do zadania dodatkowego:
pierwszy sposób to equals()
drugiego sposobu który chciałem zobaczyć nikt nie napisał, a było to
System.out.println(qwerty12345v2 == qwerty12345v3.intern());

pojawiły się za to hashCode'y których nie
  • Odpowiedz