En Thread.java, línea 146, he notado que el autor utilizó char[]
en lugar de String
para el campo de nombre. ¿Hay alguna razón de rendimiento que no conozco? getName()
también envuelve al personaje en una cadena antes de devolver el nombre. ¿No es mejor usar un String
?¿Por qué usar char [] en lugar de String?
Respuesta
En general, sí. Sospecho que char[]
se usó en Thread
por razones de rendimiento, en los días cuando tales cosas en Java requerían todo el esfuerzo para obtener un rendimiento decente. Con el advenimiento de las JVM modernas, dichas microoptimizaciones han perdido importancia desde hace tiempo, pero simplemente se han dejado de esa manera.
Hay un montón de código raro en la antigua fuente de Java 1.0-era, no le prestaría demasiada atención.
Yo sospechaba esto también. Pero luego vi 'String name' en ThreadGorup. Estaba confundido. Gracias por la respuesta. –
Voy a aceptar esta respuesta porque muchas personas sugirieron que realmente no había una buena razón. –
La cadena es inmutable, por eso la usó. La edición efectiva de Java 2end dice que "Siempre use la alternativa String donde sea posible" por Josha Blouch –
Es difícil de decir. Tal vez tenían algunas optimizaciones en mente, tal vez la persona que escribió este código simplemente estaba más acostumbrada a las matrices en C-style char*
para cadenas, o tal vez cuando se escribió este código no estaban seguras de si las cadenas serían inmutables o no. Pero con este código, cada vez que se llama a Thread.getName()
, se crea una nueva matriz de caracteres, por lo que este código es realmente más pesado en el GC que el simple uso de una cadena.
+1 Esto es cierto sobre el GC. –
Tal vez el motivo fue la protección de seguridad? La cadena se puede cambiar con la reflexión, por lo que el autor quiere copiar en lectura y escritura. Si está haciendo eso, también podría usar la matriz de caracteres para una copia más rápida.
- 1. ¿Por qué usar string :: iterator en lugar de index?
- 2. ¿Qué tiene más sentido: char * string o char * string?
- 3. ¿Debo usar String en lugar de TFilename?
- 4. String.Replace (char, char) o Replace (string, string)?
- 5. std.algorithm.joiner (string [], string): ¿por qué los elementos de resultado son dchar y no char?
- 6. ¿Por qué usar C typedefs en lugar de #defines?
- 7. Diferencia entre char * str = "STRING" y char str [] = "STRING"?
- 8. Necesita convertir String^en char *
- 9. ¿Por qué debería usar url.openStream en lugar de url.getContent?
- 10. ¿Por qué usar Enums en lugar de Constants?
- 11. std :: string vs. char *
- 12. Obteniendo una matriz char del usuario sin usar un String
- 13. ¿Cuál usar const char [] o const std :: string?
- 14. stringstream, string y char * confusión de conversión
- 15. por qué usar - en lugar de _ en la url
- 16. String to Char array Java
- 17. ¿Cuándo debería usar string en lugar de stringstream?
- 18. ¿Por qué debería usar git en lugar de svn?
- 19. Por qué/cuándo usar (!! p) en lugar de (p! = NULO)
- 20. ¿Por qué usar tuplas en lugar de objetos?
- 21. ¿por qué debería usar content_tag en lugar de html "normal"?
- 22. ¿Por qué usar curl en lugar de otros métodos?
- 23. ¿Por qué debería usar var en lugar de un tipo?
- 24. ¿Por qué usar Apio en lugar de RabbitMQ?
- 25. ¿Por qué usar System.Threading.Interlocked.Decrement en lugar de menos?
- 26. ¿Por qué usar ROLAP en lugar de simplemente MySQL?
- 27. ¿Por qué usar var en lugar del nombre de clase?
- 28. ¿Por qué debería usar operator.itemgetter (x) en lugar de [x]?
- 29. ¿Por qué usar GWT.create() en lugar de nuevo?
- 30. ¿Por qué usar registerDefaults: en lugar de setValue: forKey :?
Llamadas a String. {GetChars, getBytes, toLowerCase, ...} devuelven todos los objetos nuevos que son copias de la cadena original. Si trabaja con cadenas grandes o llama a uno de estos métodos muchas veces. Puede terminar con colecciones de basura adicionales innecesarias. Por ejemplo, imagine un latido del corazón HTTP que por cualquier razón se llama OutputStream.write (epochTimeString.getBytes()) en cada latido. Debe preocuparse por estos detalles más a menudo si trabaja con Mobile JVM. – eSniff