La questione si riduce a questo codice:Interning stringa Java, cosa è garantito?
// setup
String str1 = "some string";
String str2 = new String(str1);
assert str1.equals(str2);
assert str1 != str2;
String str3 = str2.intern();
// question cases
boolean case1 = str1 == "some string";
boolean case2 = str1 == str3;
non standard di Java fornisce alcuna garanzia sui valori di case1
e case2
? Il collegamento alla parte rilevante delle specifiche Java sarebbe bello, ovviamente.
Sì, ho esaminato tutte le "Domande simili" trovate da SO, e non ho trovato duplicati, poiché nessuno di quelli che ho trovato ha risposto alla domanda in questo modo. E no, non si tratta dell'idea sbagliata di "ottimizzare" i confronti tra stringhe sostituendo equals
con ==
.
Se non si tratta di un tentativo di ottimizzazione inutile, che cos'è? –
@dystroy Il caso particolare che ho avuto riguardava l'utilizzo di nomi di file normalizzati per la sincronizzazione e se le stringhe internate sono sicure per lo scopo o se fosse necessario un 'Map fileNameToLockObjectMap' condiviso. Non essendo sicuro, ho finito per usare una mappa in quel caso (e non tornerò a cambiare). –
hyde
Il blocco delle stringhe interne non è una buona idea. È molto probabile che tu abbia conseguenze non volute. –