Obrazek w załączniku ale ogólnie chodzi oto że dwa takie same stringi według programu są inne (zapewne inne kodowanie czy coś ale nie wiem co z tym zrobić)
Jak zrobić by było ok?
- dziwne.jpg (328 KB) - ściągnięć: 274
Obrazek w załączniku ale ogólnie chodzi oto że dwa takie same stringi według programu są inne (zapewne inne kodowanie czy coś ale nie wiem co z tym zrobić)
Jak zrobić by było ok?
String "Data i miejsce śmierci:" bez dalszego ciągu też jest przechowywany w pamięci.
Wartość zmiennej h to dokładnie to, co widzisz.
Dalej wypisywana jest wartość tab[a+1]
chodzi o to że wpisujac warunek
if( StringA == StringB)
Kompilator nie sprawdza tego czy ciagi sa takie Same, tylko czy sa w tym samym obszarze pamieci. A ze to sa 2 rozne zmienne to zwroci False.
Zeby porownac text. nalezy wpisac
if( StringA.equals(StringB))
Wtedy nastpeuje sprawdzenie warunku identycznosci ciagu.
Vanilka napisał(a):
chodzi o to że wpisujac warunek
if( StringA == StringB)
Kompilator nie sprawdza tego czy ciagi sa takie Same, tylko czy sa w tym samym obszarze pamieci. A ze to sa 2 rozne zmienne to zwroci False.
Zeby porownac text. nalezy wpisac
if( StringA.equals(StringB))
Wtedy nastpeuje sprawdzenie warunku identycznosci ciagu.
https://ideone.com/mXEg1Y
To weż wytłumacz tą magię ziomek bo trochę obala Twoją teorię, a potem dodawaj wpisy na forum.
ShermanMg napisał(a):
Vanilka napisał(a):
chodzi o to że wpisujac warunek
if( StringA == StringB)
Kompilator nie sprawdza tego czy ciagi sa takie Same, tylko czy sa w tym samym obszarze pamieci. A ze to sa 2 rozne zmienne to zwroci False.
Zeby porownac text. nalezy wpisac
if( StringA.equals(StringB))
Wtedy nastpeuje sprawdzenie warunku identycznosci ciagu.
https://ideone.com/mXEg1Y
To weż wytłumacz tą magię ziomek bo trochę obala Twoją teorię, a potem dodawaj wpisy na forum.
Chciałeś wytknąć komuś błąd no i strzeliłeś jak kulą w płot, bo to co napisała koleżanka Vanilka jest prawdą.
Porównanie Stringów w javie jest generalnie bardzo wredne , bo kompilator czasami myśli za nas co jak widać co poniektórym utrudnia życie.
Jeżeli string są jednakowe, kompilator automatycznie podpina je w to samo miejsce w pamięci, czytaj daje tą samą referencje. (albo jakoś tak :P)
Generalnie jako że stringi w Javie są immutable (niezmienne) to 2 stringi nawet o takiej samej wartości nie zwrócą nam true na ==. Wyjątkiem jest sytuacja tak jak napisałem wyżej że kompilator pomyśli za nas i nie stworzy 2 stringa tylko podepnie się pod 1.
Dlatego zadanie dla Ciebie
co zwróci taki kod:
String b="aaa";
String a = new String(b);
System.out.println(a==b);
System.out.println(a.equals(b));
sorry za offtop
wojciechmaciejewski napisał(a):
ShermanMg napisał(a):
Vanilka napisał(a):
chodzi o to że wpisujac warunek
if( StringA == StringB)
Kompilator nie sprawdza tego czy ciagi sa takie Same, tylko czy sa w tym samym obszarze pamieci. A ze to sa 2 rozne zmienne to zwroci False.
Zeby porownac text. nalezy wpisac
if( StringA.equals(StringB))
Wtedy nastpeuje sprawdzenie warunku identycznosci ciagu.
https://ideone.com/mXEg1Y
To weż wytłumacz tą magię ziomek bo trochę obala Twoją teorię, a potem dodawaj wpisy na forum.Chciałeś wytknąć komuś błąd no i strzeliłeś jak kulą w płot, bo to co napisała koleżanka Vanilka jest prawdą.
Porównanie Stringów w javie jest generalnie bardzo wredne , bo kompilator czasami myśli za nas co jak widać co poniektórym utrudnia życie.
Jeżeli string są jednakowe, kompilator automatycznie podpina je w to samo miejsce w pamięci, czytaj daje tą samą referencje. (albo jakoś tak :P)
Generalnie jako że stringi w Javie są immutable (niezmienne) to 2 stringi nawet o takiej samej wartości nie zwrócą nam true na ==. Wyjątkiem jest sytuacja tak jak napisałem wyżej że kompilator pomyśli za nas i nie stworzy 2 stringa tylko podepnie się pod 1.
Dlatego zadanie dla Ciebie
co zwróci taki kod:
String b="aaa";
String a = new String(b);
System.out.println(a==b);
System.out.println(a.equals(b));
sorry za offtop
Jakbyś dokładnie przeczytał to byś wiedział, że to co koleżanka napisała jest nieprawdą:
Vanilka napisał(a):
chodzi o to że wpisujac warunek Kompilator nie sprawdza tego czy ciagi sa takie Same, tylko czy sa w tym samym obszarze pamieci. A ze to sa 2 rozne zmienne to zwroci False.
To że to są dwie różne zmienne nie oznacza automatycznie że zostanie zwrócony 'False'.
Cały wątek od razu cytujcie w swoich postach.
Fakt: przyrównanie dwóch obiektów (a takimi typami są właśnie stringi w Javie) powoduje przyrównanie ich adresów (referencji), a nie zawartości - dlatego powinno się wykorzystywać metodę equals
.
Sztuczka: kod podany przez @ShermanMg wykorzystuje pewną optymalizację wykonywaną przez kompilator Javy, która - korzystając z tego, że stringi w Javie są niemutowalne (immutable) - nie powoduje ich duplikacji, tylko wrzuca pod to samo miejsce w pamięci, wskutek czego string1
oraz string2
są identyczną referencją, dlatego akurat w tym przypadku zwraca true
.
Niedopowiedzenie: @Vanilka miała na myśli dwie różne referencje
, tyle że nie do końca dobrze się wysłowiła. Nie rozumiem po co od razu rzucać jakieś kody oraz półhejty, zamiast na spokojnie wytłumaczyć literówkę.