Domanda

Devo archiviare in una lettera di classe 4 costante di un codice. Posso fare:

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 modo migliore ?. Tieni presente la correzione, le prestazioni, ecc.

È stato utile?

Soluzione

Le prestazioni sono irrilevanti in questo caso. Se si suppone che sia costante, non è possibile utilizzare l'approccio char [] . Prendere in considerazione:

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
  }
}

Altri suggerimenti

Nessuno dei due è errato, ma dal momento che hai a che fare con i char singolarmente, userei personalmente il char [] . Detto questo, l'impatto che ciò avrà sulle prestazioni sarà trascurabile, seppure misurabile.

A meno che tu non abbia intenzione di recuperare il personaggio diverse milioni di volte di seguito, non devi preoccuparti della performance.

Questa è quasi certamente un'ottimizzazione prematura. Qualunque cosa tu salvi in ??termini di prestazioni usando una matrice di caratteri, potresti perdere la leggibilità se devi darla ad altri metodi, poiché è più canonico accettare un String piuttosto che un char [] .

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

Ad esempio se hai 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 tua " costante " ;.

La parola chiave final ha effetto solo sul riferimento all'array, non si applica agli elementi dell'array. Vedo continuamente un errore simile con Collections.unmodifiableList () , le persone pensano che protegga il loro elenco ma il codice client può ancora accedere e modificare gli elementi dell'elenco.

Quindi, per rispondere alla tua domanda, usa la stringa.

Il significato di String corrisponde realmente a un set di char . Quindi char [] come implementazione, sebbene non sia impostato, non aggiungerebbe il significato extra di String . OTOH, potresti trovare un metodo utile in String . D'altra parte, java.util.Arrays ha anche metodi utili come [binarySearch] [2].

Forse quello che vuoi fare è introdurre un'astrazione per un insieme di char che potrebbe variare l'implementazione tra l'uso di String come il più semplice che potrebbe funzionare, la scansione lineare di un char [] (veloce se non si scansiona molto lontano), ricerca binaria, set di bit. set di bit sparsi, hash, filtro inondazioni, ecc.

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

Poiché una stringa utilizza un carattere [] per contenere le tue lettere, la vera risposta è che il carattere [] è più veloce. Quando hai dei dubbi sulla fonte, non c'è magia in String, usa solo primitive come int e char [] proprio come qualsiasi altra classe.

Non dovresti davvero preoccuparti di qualcosa di così banale come questo. In un programma succede molto di più, che preoccuparsi se una singola stringa è più veloce dell'uso di un array di caratteri.

L'unica volta che vedrai una differenza di prestazioni tra la stringa e l'array di caratteri sarà sotto un profiler, e solo perché il profiler farà la cosa sbagliata. La JVMS moderna (JDk 6+) genererà lo stesso codice per i due accessi quando la JVM deciderà che è abbastanza calda da ottimizzare.

Per rispondere alla tua domanda però; Se si utilizza Java 5, utilizzare le enumerazioni, se si utilizza qualcosa prima di Java5, utilizzare Java modello di enumerazione .

Renderà il tuo codice più leggibile, poiché non dovrai tenere traccia degli offset da qualche parte, puoi semplicemente usare l'enumerazione. Inoltre, sarà più veloce, poiché sarai in grado di fare qualcosa del tipo:


  final char codeLetter = enum.getCodeLetter(); 

Sembra che dovresti considerare di usare un enum . Vedi Tipi di enum

Divertente, ho appena scritto un post sul blog su questo ieri. Hai bisogno di una classe specializzata avvolta attorno al carattere []. I miei Personaggi class è un modo leggero per mantenere un insieme immutabile di personaggi e fornisce metodi altamente efficienti per cose come la ricerca. È open source.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top