文字配列と文字列:文字のセットを保存するのに適しています
-
03-07-2019 - |
質問
コードの定数クラス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 の使用を検討する必要があるようです。 列挙型
を参照してください。おもしろい、ブログエントリ文字クラスは、不変の文字セットを保持するための軽量な方法であり、検索などの非常に効率的なメソッドを提供します。オープンソースです。