Creazione di stringhe con operatore uguale rispetto a nuovo operatore? [chiuso]

-4

Ho visto la maggior parte delle volte che lo sviluppatore dichiara la stringa sotto la moda

Metodo 1: -

public void method1(){
String str1 ="Test";

}

Approccio 2: -

Per mia comprensione, l'approccio migliore sarà

public void method2(){
String str2 = new String("Test");

}

Sempre in base alla mia comprensione, il secondo approccio è migliore del primo, perché i valori letterali String sono internati e memorizzati in permgen. Quindi non sarà GC'ed anche il thread esce dall'approccio 1, ma nel secondo approccio lo str2 sarà GC (lo Str 2 non sarà internato) poiché il thread esce dal metodo 2 e GC viene eseguito mentre è memorizzato nell'heap non permgen.

La mia comprensione è corretta?

Per mia comprensione dovrei letterale se la stessa stringa verrà creata ancora e ancora, dato che sarà buona per il punto di vista delle prestazioni altrimenti vai per la nuova String () in modo che possa essere GC una volta non utilizzata?

Link correlati string-literal-String-Object

    
posta scott miles 17.01.2018 - 09:28
fonte

1 risposta

5

In entrambi i tuoi esempi hai una stringa letterale "Test" e in 2) hai un'altra stringa letterale "nuova". Durante il runtime, crei un'altra stringa con il contenuto di "Test" dalla stringa letterale "Test" e quindi ne crei una nuova contenente "Testnew".

In Java moderno non c'è una buona ragione per usare la nuova stringa (someString);

Nella versione precedente ce n'era una. String.substring utilizzato per creare una stringa che faceva riferimento alla stringa originale e con offset e lunghezza che lo limitavano al valore desiderato. Quindi se hai una stringa lunga e hai creato una sottostringa breve da lui, hai dimenticato tutti i riferimenti a quello lungo e hai conservato la sottostringa che avevi ancora un riferimento nella sottostringa alla stringa lunga originale. Pertanto la stringa lunga non otterrebbe GCed. Se hai usato la sottostringa = nuova stringa (sottostringa), hai creato un'istanza separata senza riferimento all'originale.

Quindi, se scegli come target le vecchie piattaforme java, dovresti comunque considerare l'utilizzo del nuovo approccio String (sottostringa) (considera, non solo usarlo !!! Devi identificare se il comportamento predefinito è prima il problema).

Questo cambiamento è avvenuto tra JDK 6 e 7. vale a articolo su programcreek

    
risposta data 17.01.2018 - 11:14
fonte

Leggi altre domande sui tag