2011-11-21 14 views
9

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?

+3

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

Respuesta

6

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.

+0

Yo sospechaba esto también. Pero luego vi 'String name' en ThreadGorup. Estaba confundido. Gracias por la respuesta. –

+0

Voy a aceptar esta respuesta porque muchas personas sugirieron que realmente no había una buena razón. –

+0

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 –

2

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.

+0

+1 Esto es cierto sobre el GC. –

1

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.

Cuestiones relacionadas