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?
risposta
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.
Lo sospettavo anch'io. Ma poi ho visto 'String name' in ThreadGorup che ero confuso. Grazie per la risposta. –
Ho intenzione di accettare questa risposta perché, come molte persone hanno suggerito, non c'era davvero una buona ragione. –
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 –
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.
+1 Questo è vero riguardo al GC. –
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.
- 1. Perché preferisci char * invece di string, in C++?
- 2. Può/Perché usare char * invece di const char * nel tipo restituito causa arresti anomali?
- 3. Dovrei usare String invece di TFilename?
- 4. Perché dovrei usare url.openStream invece di url.getContent?
- 5. Perché usare classmethod invece di staticmethod?
- 6. Perché usare jQuery su() invece di clic()
- 7. python perché usare numpy.r_ invece di concatenare
- 8. Perché usare TagBuilder invece di StringBuilder?
- 9. Perché dovrei usare log.Println invece di fmt.Println?
- 10. Quale usare const char [] o const std :: string?
- 11. Converti char [] array di String
- 12. Confronto Char/String
- 13. JAVA String to char
- 14. Perché può usare const char * come chiave per std :: map <std :: string, int>
- 15. Devo usare "TList <String>" invece di "Array of String" sempre?
- 16. Perché std :: string non fornisce una conversione in const char *?
- 17. Cosa ha più senso: char * string o char * stringa?
- 18. Perché usare 1 << 4 invece di 16?
- 19. Perché usare * args/** kwargs compressi invece di passare lista/dict?
- 20. Perché Python VM ha co_names invece di usare solo co_consts?
- 21. Perché usare contextlib.suppress invece di provare/tranne con pass?
- 22. Perché dovresti usare "extern void my_func();" invece di includere "my_utils.h"?
- 23. Perché è necessario usare @ + id invece di @id?
- 24. Perché dovrei usare un LoadBalancerProbe invece di iscrivermi all'evento RoleEnvironment.StatusCheck?
- 25. Perché dovrei usare operator.itemgetter (x) invece di [x]?
- 26. perché dovrei usare il servizio Android invece di java thread
- 27. Conversione preferita da char (non char *) a std :: string
- 28. Groovy String.toURL è deprecato: perché e cosa dovremmo usare invece?
- 29. string e const char * e .c_str()?
- 30. Quando dovrei usare String s = new String ("Hello World")?
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