Un semplice test (con JDK1.7.0_75) può mostrare la differenza:
private static final int LENGTH = 10000;
public static void main(String[] args) {
String[] strings = new String[LENGTH];
for (int i = 0; i < LENGTH; i++) {
strings[i] = "abc" + i + ".";
}
long start = System.currentTimeMillis();
for (int i = 0; i < strings.length; i++) {
String word = strings[i];
word = word.substring(0, word.length()-1);
}
long end = System.currentTimeMillis();
System.out.println("substring: " + (end - start) + " millisec.");
start = System.currentTimeMillis();
for (int i = 0; i < strings.length; i++) {
String word = strings[i];
word = word.replaceAll(".", "");
}
end = System.currentTimeMillis();
System.out.println("replaceAll: " + (end - start) + " millisec.");
start = System.currentTimeMillis();
for (int i = 0; i < strings.length; i++) {
String word = strings[i];
word = word.replace(".", "");
}
end = System.currentTimeMillis();
System.out.println("replace: " + (end - start) + " millisec.");
}
uscita:
sottostringhe: 0 millisecondi.
replaceAll: 78 millisec.
sostituire: 16 millisec.
Come previsto, la substring
è più veloce perché:
- Si evita la compilazione di un'espressione regolare.
- È tempo costante: creazione di un nuovo
String
in base agli indici di inizio e fine specificati.
Del _three_, il primo è il più veloce poiché è O (1) (ignorando i caratteri di copia che fanno tutti questi). Gli altri devono scansionare la stringa completa. –
Si noti che la seconda opzione sostituirà tutto nella stringa poiché 'replaceAll' richiede un * regex * e' .' è il carattere jolly. – Vulcan
In questo caso è meglio usare un 'StringBuilder' o altri strumenti di elaborazione del testo. –