Frage

Ich brauche in einem konstanten Klasse 4 Schreiben eines Codes zu speichern. Ich kann tun:

static final String CODE_LETTERS = "TRWAG";

oder

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

Nachdem ich eine jener Zeichen auf zwei Arten erhalten können:

final char codeLetter = CODE_LETTERS.charAt(index);

oder

final char codeLetter = CODE_LETTERS[index];

Was ist der beste Weg ?. Bitte nehmen Sie daran, Korrektur, Leistung, etc.

War es hilfreich?

Lösung

Die Leistung ist in diesem Fall irrelevant. Wenn es wirklich konstant sein soll, können Sie nicht den char[] Ansatz. Bedenken Sie:

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

Andere Tipps

Weder ist falsch, aber da Sie mit dem chars einzeln zu tun haben wirst würde ich persönlich die char [] verwenden. Das heißt, das die Auswirkungen auf die Leistung haben wird vernachlässigbar sein, wenn auch messbar.

Wenn Sie nicht den Charakter mehrere Millionen Mal in Folge holen gehen, Sie brauchen sich nicht um die Leistung zu stören.

Dies ist fast sicher eine vorzeitige Optimierung. Was auch immer Sie in der Leistung sparen, indem Sie ein Zeichen-Array verwendet, kann in Lesbarkeit verloren, wenn Sie es mit anderen Methoden geben müssen, da es mehr kanonische ist eine String eher als ein char[] zu akzeptieren.

Strings sind unveränderlich, char [] nicht. Wenn Sie dies als öffentlicher „Konstante“ in einer Klasse definieren, dann String ist die eigentliche Konstante ist.

Zum Beispiel, wenn Sie dies:

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

Ich kann alle hinterhältig sein und dies tun:

MyClass.CODE_LETTERS[0] = 'Q';

Bam, ich habe den Wert Ihrer "Konstante" geändert.

Das final Schlüsselwort betrifft nur die Referenz auf das Array, ist es nicht auf die Array-Elemente anzuwenden. Ich sehe einen ähnlichen Fehler die ganze Zeit mit Collections.unmodifiableList(), denken die Leute ihre ihre Liste zu schützen, sondern Client-Code kann immer noch die Listenelemente zugreifen und diese ändern.

So Ihre Frage zu beantworten, verwenden Sie den String.

Die Bedeutung von String stimmt wirklich eine Reihe von char. So char[] als Implementierung, wenn auch nicht Satz Sinn, würde nicht die zusätzliche Bedeutung von String hinzuzufügen. OTOH, können Sie nützliche Methode in String finden. Auf der dritten Seite java.util.Arrays hat auch nützliche Methoden wie [binarysearch] [2].

Vielleicht, was Sie tun, ist eine Abstraktion für eine Reihe von char einzuführen, die Umsetzung zwischen der Verwendung von String als einfachstes variieren kann, die möglicherweise lineare Abtastung eines char[] arbeiten konnten (schnell, wenn Sie nicht sehr weit scanne), binäre Suche, Bit gesetzt. Sparse-Bit gesetzt, gehasht, Hochwasser gefiltert, etc.

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

Da ein String ein Zeichen verwendet [] Ihre Briefe, die wahre Antwort zu halten ist das Zeichen [] schneller ist. Wenn Sie Zweifel haben Blick auf die Quelle, keine Magie in String Theres, verwendet es nur Primitiven, wie int und char [] wie jede andere Klasse.

Sie wirklich shouldnt Sorge über etwas so trivial, wie diese. Ein verdammt viel mehr passiert in einem Programm, das sich Gedanken darüber, ob ein einzelner String ist schneller als ein char-Array verwendet wird.

Das einzige Mal, dass Sie einen Performance-Unterschied zwischen dem String und dem Zeichenfeld sehen wird unter einem Profiler sein, und dann nur, weil der Profiler wird die falsche Sache tun. Moderne JVMs (JDK 6+) den gleichen Code für die beiden Zugriffe generieren, wenn die JVM entscheidet, dass diese heiß genug ist, zu optimieren.

Um Ihre Frage zu beantworten, obwohl; Wenn Sie Java 5 verwenden, verwenden Sie Aufzählungen, wenn Sie etwas vor Java5 verwenden, verwenden Sie die Java rel="nofollow Aufzählung Muster .

Es wird der Code besser lesbar machen, da Sie nicht irgendwo Spur der Offsets halten müssen, können Sie einfach die Aufzählung verwenden. Darüber hinaus ist es wird schneller, da Sie etwas zu tun in der Lage, wie:


  final char codeLetter = enum.getCodeLetter(); 

Sieht aus wie Ihre betrachten sollte ein Enum verwenden. Siehe Enum-Typen

Komisch, ich schrieb gerade einen Blog-Eintrag über diese gestern. Sie benötigen eine spezielle Klasse um den char gewickelt []. Meine Charaktere Klasse ist eine leichte Art und Weise eine unveränderliche Menge von Zeichen zu halten und hocheffiziente Methoden für Dinge wie die Suche zur Verfügung stellt. Es ist Open Source.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top