2009-04-29 9 views
7

Ho bisogno di memorizzare in una costante classe 4 lettera di un codice. Posso fare:Char Array vs String: che è meglio per la memorizzazione di una serie di lettere

static final String CODE_LETTERS = "TRWAG"; 

o

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

Dopo, posso ottenere uno di quei personaggi in due modi:

final char codeLetter = CODE_LETTERS.charAt(index); 

o

final char codeLetter = CODE_LETTERS[index]; 

qual è il miglior modo?. Si prega di prendere in considerazione correzioni, prestazioni, ecc.

+9

Sembra 5 lettere :) – willcodejavaforfood

risposta

6

In questo caso la prestazione è irrilevante. Se si suppone che sia costante, non è possibile utilizzare l'approccio char[]. Considerate:

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

Chi dice che la performance sia irrilevante? Molte persone dedicano molto impegno alle prestazioni. Ovviamente l'implementazione può fare cose cattive, ma se la rappresentazione è localizzata possiamo solo dire "non farlo poi". –

+1

Intendevo che non si tratta di prestazioni, perché la versione char [] non funziona nemmeno come previsto. Concentriamoci sulla correzione degli errori evidenti IN QUESTO CASO: ottimizzazione prematura e utilizzo di un array come costante. –

+0

Ho modificato la mia risposta dopo lo scambio sopra e ho aggiunto il qualificatore "in questo caso". Ne parlo qui per evitare di confondere troppo male i lettori. –

6

A meno che non si desideri recuperare il personaggio diverse volte di seguito, non è necessario preoccuparsi delle prestazioni.

+7

I miei pensieri esattamente. Seriamente: * L'ottimizzazione prematura è la radice di tutti i mali. * – pyrocumulus

+0

Ma ugualmente non si dovrebbe pessimizzare prematuramente. Per una stringa immutabile di lunghezza fissa, un array di caratteri sarà sempre più veloce e avrà un sovraccarico di memoria inferiore rispetto all'equivlent std :: string object. – PaulJWilliams

+0

Potrebbe essere il tipo di cosa che viene fatta molte volte. E se questo fosse un nuovo metodo nell'implementazione di 'java.lang.String'? –

8

Né è errato, ma dal momento che avremo a che fare con i char individualmente, userò personalmente lo char []. Detto questo, l'impatto che questo avrà sulle prestazioni sarà trascurabile se non addirittura misurabile.

5

Questo è quasi certamente un'ottimizzazione prematura. Qualunque cosa tu risparmi in termini di prestazioni usando un array di caratteri può essere persa nella leggibilità se devi darlo ad altri metodi, dal momento che è più canonico accettare uno String piuttosto che uno char[].

1

Poiché una stringa utilizza un carattere [] per contenere le lettere, la risposta vera è che il carattere [] è più veloce. In caso di dubbio, guarda la fonte, non c'è magia in String, usa solo le primitive come int e char [] proprio come qualsiasi altra classe.

Non dovresti davvero preoccuparti di qualcosa di così semplice come questo. Succede molto di più all'interno di un programma, che preoccupa se una singola stringa è più veloce dell'utilizzo di un array di caratteri.

+0

Sì, ma quando una stringa è semanticamente pensata per essere usata come una stringa invece di una matrice di caratteri, si deve usare String. L'utilizzo di char [] in Java ha senso solo se si desidera lavorare con singoli elementi dei caratteri o se è necessario sostituire frequentemente le posizioni degli array. – orad

2

Il significato di String realtà non corrisponde un set di char. Quindi char[] come un'implementazione, anche se non con il significato impostato, non aggiungerebbe il significato aggiuntivo di String. OTOH, potresti trovare il metodo utile in String. Nella terza mano, java.util.Arrays ha anche metodi utili come [binarySearch] [2].

Forse ciò che si vuole fare è presentare un'astrazione per una serie di char che può variare tra l'uso implementazione String come il più semplice che possa funzionare, la scansione lineare di una char[] (veloce se non si esegue la scansione molto lontano) , ricerca binaria, bit impostato. po 'insieme sparso, hash, inondazioni filtrato, ecc

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

1

L'unica volta che si vedrà una differenza di prestazioni tra la corda e l'array di caratteri sta andando essere sotto un profiler, e solo perché il profiler farà la cosa sbagliata. Modern JVMS (JDk 6+) genererà lo stesso codice per i due accessi una volta che la JVM deciderà che questo è abbastanza caldo da ottimizzare.

Per rispondere alla domanda; Se si utilizza Java 5, utilizzare le enumerazioni, se si utilizza qualcosa prima di Java5, utilizzare Java enumeration Pattern.

Renderà il codice più leggibile, poiché non è necessario tenere traccia degli offset da qualche parte, è sufficiente utilizzare l'elenco. Inoltre, sarà essere più veloce, dal momento che sarà in grado di fare qualcosa di simile:


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

Non c'è indicazione che enum sia ciò che vuole. Se sta per usare i personaggi come personaggi da qualche parte, non ha senso archiviarli come enumerati. – DJClayworth

+0

Se i valori di enum sono T, R, W, A, G allora toString() potrebbe essere usato. –

1

Sembra che il tuo dovrebbe considerare l'utilizzo di un enum. Vedi Enum Types

+1

Senza sapere quale sia l'uso non è un buon suggerimento.Se ha intenzione di confrontare il personaggio con altri personaggi, allora un enume non ha senso. – DJClayworth

5

Le stringhe sono immutabili, char [] non lo è. Se stai definendo questa come una "costante" pubblica in una classe, allora String è la vera costante.

Per esempio, se si dispone di questo:

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

posso essere tutto subdolo e fare questo:

MyClass.CODE_LETTERS[0] = 'Q'; 

Bam, ho cambiato il valore della vostra "costante".

La parola chiave final riguarda solo il riferimento all'array, non si applica agli elementi di matrice. Vedo un errore simile tutto il tempo con Collections.unmodifiableList(), la gente pensa che protegga la loro lista ma il codice cliente può ancora accedere e modificare gli elementi della lista.

Quindi, per rispondere alla domanda, utilizzare la stringa.

0

Divertente, ho appena scritto un blog entry su questo ieri. Hai bisogno di una classe specializzata avvolta nel char []. La mia classe Characters è un modo leggero per mantenere un insieme immutabile di caratteri e fornisce metodi altamente efficienti per cose come la ricerca. È open source.

+0

La tua classe avrebbe ordinato i suoi personaggi in costruzione, quindi non risponde alla sua domanda, ma mi piace l'idea che sta dietro alla classe. Se potessi fare +1 sul post del tuo blog, lo farei. – ahcox

+0

@ahcox, grazie per le belle parole. Ho aggiunto la funzionalità "mi piace" di Facebook al mio blog, quindi sentitevi liberi di provarlo! ;) –