質問

コードの定数クラス4文字に保存する必要があります。できること:

static final String CODE_LETTERS = "TRWAG";

または

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

その後、次の2つの方法でその文字の1つを取得できます。

final char codeLetter = CODE_LETTERS.charAt(index);

または

final char codeLetter = CODE_LETTERS[index];

最良の方法は何ですか?修正、パフォーマンスなどに留意してください。

役に立ちましたか?

解決

この場合、パフォーマンスは無関係です。本当に一定であると想定される場合は、 char [] アプローチを使用できません。考慮:

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

他のヒント

どちらも間違っていませんが、 char を個別に処理するため、個人的に char [] を使用します。とはいえ、これがパフォーマンスに与える影響は、測定可能であっても無視できる程度です。

連続して数百万回キャラクターをフェッチする場合を除き、パフォーマンスを気にする必要はありません。

これはほぼ確実に時期尚早な最適化です。 char [] <ではなく String を受け入れる方が標準的であるため、他のメソッドに渡す必要がある場合、文字配列を使用してパフォーマンスを節約するものは読みにくくなる可能性があります/ code>。

文字列は不変ですが、char []は不変です。これをパブリックの「定数」として定義している場合、クラスでは、Stringは実際の定数です。

たとえば、これがある場合:

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

私はすべて卑劣になり、これを行うことができます:

MyClass.CODE_LETTERS[0] = 'Q';

バム、「定数」の値を変更しました。

final キーワードは、配列への参照にのみ影響し、配列要素には適用されません。 Collections.unmodifiableList()で同様の間違いを常に目にします。人々はリストを保護していると考えていますが、クライアントコードはリスト要素にアクセスして変更できます。

したがって、質問に答えるには、文字列を使用します。

String の意味は、一連の char と実際に一致します。したがって、実装としての char [] は、セットを意味するものではありませんが、 String の特別な意味を追加しません。 OTOH、 String に便利なメソッドがあります。第三に、 java.util.Arrays には、[binarySearch] [2]などの便利なメソッドもあります。

おそらくあなたがしたいことは、 String を使用することで実装を変える可能性がある一連の char の抽象化を導入することです。 char [] (あまり遠くまでスキャンしない場合は高速)、バイナリ検索、ビットセット。スパースビットセット、ハッシュ、フラッドフィルタなど。

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

文字列はchar []を使用して文字を保持するため、本当の答えはchar []の方が速いということです。疑わしいソースを見ると、Stringには魔法がなく、intやchar []などのプリミティブを他のクラスと同じように使用します。

これほど些細なことを本当に気にするべきではありません。プログラム内では、char配列を使用するよりも単一のStringの方が高速であるかどうかを心配する、非常に多くのことが起こります。

文字列と文字配列のパフォーマンスの違いが見られるのは、プロファイラーの下になり、プロファイラーが間違ったことをするからです。最新のJVMS(JDk 6+)は、最適化に十分なほどホットであるとJVMが判断すると、2つのアクセスに対して同じコードを生成します。

しかしあなたの質問に答えるために; Java 5を使用している場合は列挙を使用し、Java5より前のものを使用している場合は Javaを使用します列挙パターン

オフセットをどこかに追跡する必要がないため、コードを読みやすくします。列挙型を使用するだけです。さらに、次のようなことができるため、 高速になります。


  final char codeLetter = enum.getCodeLetter(); 

enum の使用を検討する必要があるようです。 列挙型

を参照してください。

おもしろい、ブログエントリ文字クラスは、不変の文字セットを保持するための軽量な方法であり、検索などの非常に効率的なメソッドを提供します。オープンソースです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top