Hardware o design?

Driiin driin, scendo giù, il mio spacciatore di hardware Apple (k) mi consegna a domicilio il gioiellino (in tutti i sensi): il topo magico! Mouse wireless/touch pad/che altro? Delux!
Scarico il "Wireless Mouse Software", installo, riavvio, apro System Preferences ed eccolo:

Poi, dò un'occhiata alla mia scrivania e ditemi voi se questa non è classe! Grazie Aerandir!

Java Performance: occhio alla concatenazione delle stringhe.

E' utile prestare l'attenzione alle performance del nostro codice, dato che la concatenazione delle stringhe è una delle operazioni più comuni e frequenti.
Oggi ho letto quest'articolo molto interessante
StringBuilder vs StringBuffer vs String.concat - done right e ne riassumo il contenuto qui di seguito.
Il dilemma è :
operatore "+", StringBuffer o StringBuilder?

Innanzitutto è importante sottolineare che gli oggetti String in Java sono immutabili, ovvero una volta creati non possono essere più modificati. Pertanto "modificare" una stringa significa creare un nuovo oggetto e rendere il nuovo oggetto la referenza alla variabile che stiamo modificando. Quindi, quando si concatenano stringhe, non si fa altro che creare un nuovo oggetto con il contenuto delle stringhe concatenate.

Una volta detto questo le deduzioni sono semplici. Se si utilizza:
  • l'operatore "+" ( o String.concat() ): viene creata una nuova stringa, il valore della vecchia viene copiato nel nuovo oggetto e viene accodata l'altra stringa. Più lunga è la stringa, più lento è il processo (che coinvolge anche il Garbage Collector per la rimozione degli non più utilizzati). Evitate di utilizzare "+" in un loop! Va benissimo per System.out.println("x:"+x+" y:"+y);

  • la classe StringBuffer: è una sequenza di caratteri "thread-safe" (synchronized) e modificabile. In qualsiasi punto ed in ogni momento, il contenuto può essere può essere modificato utilizzando gli appositi metodi ( append, insert ... ).

  • la classe StringBuilder (a partire da Java 1.5): il funzionamento è pressocchè uguale ma è più veloce di StringBuffer, poichè non è synchronized.
IN CONCLUSIONE: And the winner is.... StringBuilder!!!
Se dobbiamo costruire delle stringhe molto lunghe, o all'interno di loop o ancora modificarne frequentemente il contenuto, è senz'altro indispensabile utilizzare StringBuilder. Per semplici concatenazioni di piccole stringhe, utilizziamo il "+" che riduce notevolmente la quantità di codice da scrivere.