18 giugno 2005

Somme

Un noto problema di Java è l'unione, o concatenazione, di stringhe.
Si dovrebbe usare la classe StringBuffer, ma questa ha i metodi sincronizzati, e quindi aggiunge un piccolo overhead.
Dopo anni e anni la Sun finalmente ci regala StringBuilder, che è del tutto uguale, ma non ha metodi sincronizzati.
Mi faccio un programmino scemo:

public class Sb1 extends Thread
{
public void run()
{
long t = System.currentTimeMillis();
StringBuffer a = new StringBuffer();
for (int i = 0; i < 100000; i++)
{
a.append(1);
}
System.out.println("StringBuffer: " + (System.currentTimeMillis() - t));
}
}

e uno fotocopia con StringBuilder.
Li lancio così:

public class ConfStrings
{
public static void main(String[] args)
{
Thread t2=new Sb1();
Thread t3=new Sb2();
t2.start();
t3.start();
}
}

Ogni volta StringBuffer finisce prima, vince sempre lui.
Perché allora l'help della Sun scrive imperterrito where possible, it is recommended that this class be used in preference to StringBuffer as it will be faster under most implementations?

2 commenti:

  1. > a.append(1);

    a.append(i);

    RispondiElimina
  2. È uguale, per append va bene qualunque cosa che possa diventare String tramite una String.valueOf.
    Comunque ho provato anche così e il risultato non cambia.

    RispondiElimina