Newsgroup: it.comp.java
Titolo: confronto fra stringhe e operatore ==

Salve ragazzi...
mi trovo di fronte ad un problema assurdo...
il confronto fra stringhe non funziona come dovrebbe.. o meglio
io ho un array di tipo String contenent n stringhe, ed una stringa -la mia
chiave di ricerca- faccio un semplice loop:
**************************************************************
int e = -1;
for(int i=0;i<array.length;i++) {
 if (array[i]==searchKey) {
  e = i;
 }
}
if(e==-1) {
 System.out.println ("sorry, not found");
} else {
 System.out.println ("found in position " + array[e]);
 System.out.println (":-)");
}
**************************************************************
lasciando stare la non-efficienza dell'algoritmo di cui sopra..
per quale motivo la stringa non viene mai trovata nell'array?
pur essendoci!!? ho controllato che nell'array non ci siano spazi
extra, maiuscole/minuscole differenti ecc... in pratica il mio
array e' cosi':
array[0]="A"
array[1]="B"
array[2]="C"
searchKey="B"
dovrebbe quindi stamparmi che l'ha trovato "in position 1"
invece non lo trova...
l'operatore di uguaglianza funziona per tutti i tipi dati o no?
grazie.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 grazie.
Prego, ciao
Co

 l'operatore di uguaglianza funziona per tutti i tipi dati o no?
L'operatore di ugualianza, se applicato a dei tipi, esegue un confronto
fra reference.
Quindi due String distinte risultano diverse anche se sono uguali.
Per il confronto corretto si usa il metodo equals():

> l'operatore di uguaglianza funziona per tutti i tipi dati o no?
CA> Questo significa che se usi l'operatore di uguaglianza == non stai
CA> confrontando le stringhe ma le referenze, detto in maniera brutta,
CA> "gli indirizzi".
Beh, non ho ancora visto una JVM dove la reference non è implementata
come puntatore :)
CA> String s1 = "A"; String s2 = "A";
CA> return s1 == s2;
CA> ritorna false perche' s1 ed s2 puntano a due oggetti diversi.
Oddio, l'esempio non è felicissimo.
Infatti lo  scrivere stringa1 ==  stringa2 può avere  effetti "strani"
almeno per chi non considera il comportamento della JVM.
La JVM, per risparmiare memoria, usa un unico oggetto String per tutte
le stringhe inserite come literal (anche se in classi diverse). Quindi
nel tuo  esempio s1 ==  s2 torna vero  in quanto sia  ad s1 che  ad s2
viene assegnato un riferimento allo stesso oggetto.
Invece  per  le stringhe  "ottenute  a  runtime" (per  rielaborazione,
acquisite in input, etc) si ha che l'espressione vale falso.
Ho  visto questa  cosa su  una applicazione  che "finora  aveva sempre
funzionato":  per pura botta  di culo  al test  arrivavano riferimenti
alla medesima stringa quando il test doveva essere true!!!
CA> Per gli oggetti che
CA> implementano Comparable, puoi usare il metodo compare, che devi
CA> usare nel tuo caso per ottenere cio' che vuoi
Fare attenzione quando si implementa la compareTo() di Comparable, che
è "necessario" implementare  una funzione hashCode() in modo  che se è
vero che
        obj1.compare(obj2) == 0
allora  assolutamente   deve  essere  vero che
        obj1.hashCode() ==  obj2.hashCode() 
(ma può essere anche che si abbia obj1.hashCode() == obj2.hashCode() e
obj1.compare(obj2) != 0 !!!)
-- 
 /\           ___
/___/\_|_|\_|__|___Gian Uberto Lauri_____
  //--\| | \|  |   Integralista GNUslamico
\/                 e coltivatore diretto di Software

 ritorna false perche' s1 ed s2 puntano a due oggetti diversi.
Esempio sbagliato. La JVM ha l'accortezza di utilizzare per le stringhe
literal uguali lo stesso spazio di memoria. Quindi in questo caso le
reference s1 e s2 sono uguali.

 ritorna false perche' s1 ed s2 puntano a due oggetti diversi.
Come hanno gia fatto notare gli altri questo esempio e' sbagliato, la jvm in 
effetti si rende conto di due stringhe uguali. In realta' quando ho scritto 
queste righe credo volessi anche parlare dell'immutabilita' dell'oggetto String 
ma mi son perso in ciance (sbagliate)!.
Sorry, Co

 come puntatore :)
lol sicuramente vero, ma e' poco javistico!

Uff, me ne dimentico sempre un pezzo... volevo correggere l'esempio
String s1 = new String("A");
String s2 = new String("A");
return s1 == s2;
ritorna falso!
Corrado Alesso ha scritto:


> implementata come puntatore :)
CA> lol sicuramente vero, ma e' poco javistico!
Mah, io penso  che abbiano usato il nome  reference perché con pointer
la gente si sarebbe messa  a cianciare di aritmetica dei puntatori, di
pericolosità dei puntatori e via dicendo.
