私はC++からJavaに移行したばかりの学生です。Javaの文字列と文字配列
Javaでは、文字列と文字配列のデータ型を別々に定義する主な理由は何ですか?両者の違いは何ですか?
私はC++だけしか研究していないので、これまでは同じことをしていました。可能であれば、明確にしてください。
私はC++からJavaに移行したばかりの学生です。Javaの文字列と文字配列
Javaでは、文字列と文字配列のデータ型を別々に定義する主な理由は何ですか?両者の違いは何ですか?
私はC++だけしか研究していないので、これまでは同じことをしていました。可能であれば、明確にしてください。
String
は不変です。 Char
配列はありません。文字列はchar配列で実装されていますが、(連結などのように)変更しようとするたびに、という新しいString
オブジェクトが返されます。
したがって、String
は定数Char
という配列として動作しますが、使用するのが非常に簡単な特定の構文糖もあります。たとえば、追加の+
演算子はで、文字列連結演算子としてもがオーバーロードされています。
Javaでは、String
は基本的にchar[]
をラップする基本システムクラスです。ほとんどの場合、配列を直接処理するよりもフルクラスを持つ方が望ましい理由はいくつかあります。
String
は不変です。 String
への参照があれば、それは決して変わることはないと知っています。String
はベア配列ができなかった有用な方法、例えばlength()
を提供し、明確に定義された比較セマンティクスを持っています。+
)をサポートするための "演算子のオーバーロードなし"の規則の特別な例外があります。基本的に、それは同じ場所で所望の動作やデータ構造を収集するためにクラスを使用するのが良いOOの実践だ、とString
は、文字列に対して実行する便利な操作と文字の配列をラップします。
応答いただきありがとうございます。私は別の疑問を持っています - charオブジェクトのようにStringオブジェクトを使用できますか?任意のポイントでランダムな要素にアクセスしたい場合や、任意のインデックスにcharを格納したい場合は、Stringで行うことができますか? – iluvthee07
[The Javadoc](http://docs.oracle.com/javase/7/docs/api/java/lang/String.html)は読む価値があります。 'String'は不変です。つまり、一度作成すると変更できません。 'charAt'はバッキング配列内の個々の文字に読み取り専用アクセスを提供します。 'StringBuilder'(およびより古い、より遅い' StringBuffer')は、 'char []'の周りに読み書きのセマンティクスを提供します。それは、あなたがそれをビルドすると、読み込み専用 'String'に変換できます。 – chrylis
文字列オブジェクトを使用する利点は、使用できるすべてのメソッドです。たとえば :
stringExample1.equals(stringExample2);
String stringExample3 = stringExample1.replace(substring1, substring2);
セマンティック違いがあります。同じようにデータが保存されているからといって、同じことを意味するわけではありません。 Dates
とAmounts
は、同じ内部表現(タイムスタンプまたは固定小額の現金ではlong
)でも同じではありません。 char
アレイは、16ビットイメージを意味することもできます。オブジェクト指向で
、それは彼らが何であるかに基づいてモデルオブジェクトへの良い練習だとでき、およびない、彼らは内部的に自分のデータを保存する方法によって。 は、のデータ(getter/setterによるアクセスを制限または制御(オブザーバサポート)、または内部表現を不変またはプール可能にする)をカプセル化し、オブジェクトに適切なメソッドを提供することができます。
文字列はJavaでは不変であり、Stringプールに格納されます。いったん作成されると、ガーベージが収集されるまでプール内にとどまります。したがって、Stringは不変です。ロギングパスワードは読み取り可能な文字列です。パスワードを見つけるためにメモリダンプを生成するリスクが高くなります。
ここで、文字配列はヒープで作成され、いくつかのダミー値で上書きできます。
ありがとうございます。私は別の疑問を持っています - charオブジェクトのようにStringオブジェクトを使用できますか?任意のポイントでランダムな要素にアクセスしたい場合や、任意のインデックスにcharを格納したい場合は、Stringで行うことができますか? – iluvthee07
ラヴィは彼の答えを受け入れるに値する。答えを少し拡張するために、人間とやりとりするコンピュータシステムの本質的な必要性のために、プログラミング時に扱う最も一般的なデータ構造の1つは 'String'です。 Javaのデザイナーはこれを認識し、文字列とのやりとりをより便利にするために、char []を特殊文字列Objectにラップしました。 – StormeHawke
@ iluvthee07 - はい。最初の場合に 'string.charAt(index)'が必要です。 2番目の場合は、部分文字列を使って演奏するか、 'string.toCharArray()'を使って演奏する必要があります。 'String'を使ってできることの詳細については、ここで' String' javadocを見てみることをお勧めします:http://docs.oracle.com/javase/6/docs/api/java/lang /String.html – StormeHawke