http://kohlerm.blogspot.co.uk/2009/01/is-javalangstringintern-really-evil.html
afferma che String.equals()
utilizza "=="
per confrontare gli String
oggetti prima, secondo
http://www.codeinstructions.com/2009/01/busting-javalangstringintern-myths.html
confronta le lunghezze delle stringhe e quindi i contenuti.
(A proposito, le stringhe del codice prodotto in un catalogo di vendita possono avere la stessa lunghezza - BIC0417 è un casco di sicurezza per ciclisti, TIG0003 è una tigre maschio adulta viva - probabilmente avrai bisogno di tutti i tipi di licenze per ordinarne una. forse è meglio ordinare un casco di sicurezza allo stesso tempo.)
Quindi sembra che tu tragga vantaggio dalla sostituzione delle tue stringhe con la loro intern()
versione, ma ottieni sicurezza - e leggibilità e conformità standard - senza usare "==" per la equals()
tua programmazione. E la maggior parte di ciò che dirò dipende dal fatto che sia vero, se è vero.
Ma String.equals()
prova che gli hai passato una stringa e non qualche altro oggetto, prima di usarlo "=="
? Non sono qualificato per dirlo, ma immagino di no, perché la stragrande maggioranza di tali equals()
operazioni sarà String to String, quindi il test viene quasi sempre superato. In effetti, dare la priorità a "==" all'interno String.equals()
implica la certezza che si sta spesso confrontando la stringa con lo stesso oggetto reale.
Spero che nessuno sia sorpreso che le seguenti righe producano un risultato "falso":
Integer i = 1;
System.out.println("1".equals(i));
Ma se si i
passa i.toString()
a nella seconda riga, ovviamente lo è true
.
I luoghi in cui potresti sperare in un beneficio dal tirocinio includono Set
e Map
, ovviamente. Spero che le stringhe internate abbiano i loro hashcode nella cache ... Penso che sarebbe un requisito. E spero di non aver appena dato via un'idea che potrebbe farmi guadagnare un milione di dollari. :-)
Per quanto riguarda la memoria, è anche ovvio che questo è un limite importante se il volume di stringhe è grande o se si desidera che la memoria utilizzata dal codice del programma sia molto piccola. Se il tuo volume di -distinct- Strings è molto grande, potrebbe essere il momento di prendere in considerazione l'utilizzo di un codice di programma di database dedicato per gestirli e un server di database separato. Allo stesso modo, se riesci a migliorare un piccolo programma (che deve essere eseguito contemporaneamente in 10000 istanze) avendo esso non memorizza affatto le sue stringhe.
È inutile creare una nuova stringa e poi scartarla immediatamente per il suo intern()
sostituto, ma non esiste un'alternativa chiara, tranne per mantenere la stringa duplicata. Quindi davvero il costo di esecuzione è di cercare la tua stringa nel pool interno e quindi consentire al garbage collector di smaltire l'originale. E se è una stringa letterale, allora viene già internata.
Mi chiedo se intern()
possa essere abusato dal codice di programma dannoso per rilevare se alcuni riferimenti String e i loro oggetti esistono già nel intern()
pool e quindi esistono altrove nella sessione Java, quando ciò non dovrebbe essere noto. Ma ciò sarebbe possibile solo quando il codice del programma viene già utilizzato in modo fidato, immagino. Tuttavia, è qualcosa da considerare sulle librerie di terze parti che includi nel tuo programma per memorizzare e ricordare i tuoi numeri PIN ATM!