2009-04-29 49 views
7

Necesito almacenar en una clase constante 4 letras de un código. Puedo hacer:Char Array vs String: que es mejor para almacenar un conjunto de letras

static final String CODE_LETTERS = "TRWAG"; 

o

static final char[] CODE_LETTERS = {'T', 'R', 'W', 'A', 'G'}; 

Después, puedo obtener uno de los que los caracteres de dos maneras:

final char codeLetter = CODE_LETTERS.charAt(index); 

o

final char codeLetter = CODE_LETTERS[index]; 

¿cuál es la ¿mejor manera?. Tenga en cuenta la corrección, el rendimiento, etc.

+9

Parece que tiene 5 letras :) – willcodejavaforfood

Respuesta

6

El rendimiento es irrelevante en este caso. Si realmente se supone que es constante, no puede usar el enfoque char[]. Considere:

public class Test 
{ 
    static final char[] CODE_LETTERS = {'T', 'R', 'W', 'A', 'G'}; 

    public static void main(String[] args) throws Exception 
    { 
    System.out.println(CODE_LETTERS[0]); // T 
    CODE_LETTERS[0] = 'x'; 
    System.out.println(CODE_LETTERS[0]); // x 
    } 
} 
+1

¿Quién dice que el rendimiento es irrelevante? Mucha gente gasta mucho esfuerzo en el rendimiento. Por supuesto, la implementación puede hacer cosas malas, pero si la representación está localizada, podemos simplemente decir "no hagas eso entonces". –

+1

Quise decir que no se trata de rendimiento, porque la versión char [] ni siquiera funciona como se esperaba. Concentrémonos en corregir los errores obvios EN ESTE CASO: optimización prematura y uso de una matriz como constante. –

+0

Edité mi respuesta después del intercambio anterior y agregué el calificador "en este caso". Lo menciono aquí para evitar confundir a los lectores demasiado mal. –

6

A menos que vaya a buscar el personaje varias millones de veces seguidas, no necesita preocuparse por el rendimiento.

+7

Mis pensamientos exactamente. En serio: * La optimización prematura es la raíz de todo mal. * – pyrocumulus

+0

Pero igualmente uno no debería pesimizar prematuramente. Para una cadena inmutable de longitud fija, una matriz de caracteres siempre será más rápida y tendrá menos carga de memoria que el objeto equiavlent std :: string. – PaulJWilliams

+0

Puede ser el tipo de cosa que se realiza muchas veces. ¿Qué pasa si este es un nuevo método en la implementación de 'java.lang.String'? –

8

Ninguno de los dos es incorrecto, pero ya que va a tratar con el char de forma individual, yo personalmente usaría el char []. Dicho esto, el impacto que esto tendrá en el rendimiento va a ser insignificante, incluso medible.

5

Esto es casi seguro una optimización prematura. Lo que ahorre en rendimiento mediante el uso de una matriz de caracteres puede perderse en legibilidad si necesita dársela a otros métodos, ya que es más canónico aceptar String en lugar de char[].

1

Dado que una cadena usa un carácter [] para contener las letras, la verdadera respuesta es que el carácter [] es más rápido. Cuando dudes de ver la fuente, no hay magia en String, solo usa primitivas como int y char [] como cualquier otra clase.

Realmente no deberías preocuparte por algo tan trivial como este. Sucedió muchísimo más dentro de un programa, preocupado por si un solo String es más rápido que el uso de un arreglo de caracteres.

+0

Sí, pero cuando una cadena se supone semánticamente para ser utilizada como una cadena en lugar de una matriz de caracteres, se debe utilizar String. Usar char [] en Java solo tiene sentido si quiere trabajar con elementos de caracteres individuales o necesita reemplazar frecuentemente las posiciones de la matriz. – orad

2

El significado de String no coincidía con un conjunto de char. Por lo tanto, char[] como una implementación, aunque no tenga significado, no agregaría el significado adicional de String. OTOH, puede encontrar un método útil en String. Por otro lado, java.util.Arrays también tiene métodos útiles como [binarySearch] [2].

Tal vez lo que quiere hacer es introducir una abstracción de un conjunto de char que puede variar entre el uso de la aplicación String como el más simple que podría funcionar, escaneo lineal de un char[] (rápida si no escanea muy lejos) , búsqueda binaria, bit set. conjunto escasa bits, hash, inundación filtrada, etc.

[2]: http://java.sun.com/javase/6/docs/api/java/util/Arrays.html#binarySearch(char[], int, int, char)

1

La única vez que usted verá una diferencia de rendimiento entre la cuerda y la matriz de caracteres va estar bajo un perfilador, y solo porque el perfilador hará lo incorrecto. El JVMS moderno (JDk 6+) generará el mismo código para los dos accesos una vez que la JVM decida que está lo suficientemente caliente como para optimizarlo.

Para responder a su pregunta; Si está utilizando Java 5, use enumeraciones, si está utilizando algo anterior a Java5, use el Java enumeration Pattern.

Hará que su código sea más legible, ya que no tendrá que hacer un seguimiento de los desplazamientos en alguna parte, solo puede usar la enumeración. Además, se ser más rápido, ya que será capaz de hacer algo como:


    final char codeLetter = enum.getCodeLetter(); 
+1

No hay indicación de que enum sea lo que él quiere. Si va a usar los personajes como personajes en algún lugar, entonces no tiene sentido almacenarlos como enumeraciones. – DJClayworth

+0

Si los valores enum son T, R, W, A, G, se podría usar toString(). –

1

Parece que tu debe considerar el uso de una enumeración . Ver Enum Types

+1

Sin saber cuál es el uso, esa no es una buena sugerencia.Si va a comparar el personaje con otros personajes, entonces una enumeración no tiene sentido. – DJClayworth

5

Las cadenas son inmutables, char [] no lo es. Si define esto como una "constante" pública en una clase, String es la constante real.

Por ejemplo, si usted tiene esto:

public class MyClass { 
    public static final char[] CODE_LETTERS = {'h', 'e', 'l', 'l', 'o'}; 
    .... 
} 

yo puedo ser lo astuto y hacer esto:

MyClass.CODE_LETTERS[0] = 'Q'; 

Bam, he cambiado el valor de su "constante".

La palabra clave final solo afecta la referencia a la matriz, no se aplica a los elementos de la matriz. Veo un error similar todo el tiempo con Collections.unmodifiableList(), la gente piensa que protege su lista, pero el código del cliente todavía puede acceder y modificar los elementos de la lista.

Para responder a su pregunta, utilice la Cadena.

0

Gracioso, acabo de escribir un blog entry sobre esto ayer. Necesitas una clase especializada envuelta alrededor del char []. Mi clase Characters es una forma ligera de mantener un conjunto inmutable de caracteres y proporciona métodos altamente eficientes para cosas como la búsqueda. Es de código abierto.

+0

Tu clase habría ordenado sus personajes en la construcción por lo que realmente no responde a su pregunta, pero me gusta la idea detrás de la clase. Si pudiera +1 publicar tu blog por derecho propio, lo haría. – ahcox

+0

@ahcox, gracias por las lindas palabras. He agregado la funcionalidad "me gusta" de Facebook a mi blog, ¡así que no dude en probarlo! ;) –

Cuestiones relacionadas