2011-11-21 18 views
9

In Thread.java, riga 146, ho notato che l'autore ha utilizzato uno char[] anziché uno String per il campo del nome. Ci sono motivi di prestazioni di cui non sono a conoscenza? getName() avvolge anche il carattere in una stringa prima di restituire il nome. Non è meglio usare solo un String?Perché usare char [] invece di String?

+3

Le chiamate a String. {GetChars, getBytes, toLowerCase, ...} restituiscono tutti i nuovi oggetti che sono copie della stringa originale. Se lavori con stringhe di grandi dimensioni o chiama uno di questi metodi molte volte. Potresti finire con inutili raccolte di rifiuti inutili. Ad esempio, immagina un heartbeat HTTP che, per qualsiasi motivo, si chiama OutputStream.write (epochTimeString.getBytes()) a ogni battito. Devi preoccuparti di questi dettagli più spesso se lavori con Mobile JVM. – eSniff

risposta

6

In generale si. Sospetto che char[] sia stato utilizzato in Thread per motivi di prestazioni, ai tempi in cui cose del genere in Java richiedevano ogni sforzo per ottenere prestazioni decenti. Con l'avvento delle moderne JVM, tali micro-ottimizzazioni sono ormai divenute poco importanti, ma sono state lasciate in questo modo.

C'è un sacco di codice strano nella vecchia fonte dell'era Java 1.0, non presterei troppa attenzione ad esso.

+0

Lo sospettavo anch'io. Ma poi ho visto 'String name' in ThreadGorup che ero confuso. Grazie per la risposta. –

+0

Ho intenzione di accettare questa risposta perché, come molte persone hanno suggerito, non c'era davvero una buona ragione. –

+0

La stringa è immutabile, ecco perché l'ha usata. Un'efficace edizione di java 2end dice che "Usa sempre la stringa alternativa dove mai possibile" di Josha Blouch –

2

Difficile dire. Forse avevano in mente alcune ottimizzazioni, forse la persona che ha scritto questo codice era semplicemente più abituata agli array char* di tipo C per le stringhe, o forse al momento in cui questo codice è stato scritto non erano sicuri se le stringhe fossero immutabili o meno. Ma con questo codice, ogni volta che viene chiamato un Thread.getName(), viene creato un nuovo array di caratteri, quindi questo codice è in realtà più pesante sul GC rispetto all'uso di una stringa.

+0

+1 Questo è vero riguardo al GC. –

1

Forse il motivo era la protezione della sicurezza? La stringa può essere cambiata con la riflessione, quindi l'autore vuole copiare su lettura e scrittura. Se lo fai, potresti anche usare il char array per una copia più rapida.

Problemi correlati