2013-08-20 38 views
8

私はC++からJavaに移行したばかりの学生です。Javaの文字列と文字配列

Javaでは、文字列と文字配列のデータ型を別々に定義する主な理由は何ですか?両者の違いは何ですか?

私はC++だけしか研究していないので、これまでは同じことをしていました。可能であれば、明確にしてください。

答えて

15

Stringは不変です。 Char配列はありません。文字列はchar配列で実装されていますが、(連結などのように)変更しようとするたびに、という新しいStringオブジェクトが返されます。

したがって、Stringは定数Charという配列として動作しますが、使用するのが非常に簡単な特定の構文糖もあります。たとえば、追加の+演算子はで、文字列連結演算子としてもがオーバーロードされています。

+0

ありがとうございます。私は別の疑問を持っています - charオブジェクトのようにStringオブジェクトを使用できますか?任意のポイントでランダムな要素にアクセスしたい場合や、任意のインデックスにcharを格納したい場合は、Stringで行うことができますか? – iluvthee07

+1

ラヴィは彼の答えを受け入れるに値する。答えを少し拡張するために、人間とやりとりするコンピュータシステムの本質的な必要性のために、プログラミング時に扱う最も一般的なデータ構造の1つは 'String'です。 Javaのデザイナーはこれを認識し、文字列とのやりとりをより便利にするために、char []を特殊文字列Objectにラップしました。 – StormeHawke

+1

@ iluvthee07 - はい。最初の場合に 'string.charAt(index)'が必要です。 2番目の場合は、部分文字列を使って演奏するか、 'string.toCharArray()'を使って演奏する必要があります。 'String'を使ってできることの詳細については、ここで' String' javadocを見てみることをお勧めします:http://docs.oracle.com/javase/6/docs/api/java/lang /String.html – StormeHawke

2

StringはJavaのクラスであり、メソッドを提供し、オブジェクトでもあります。

文字列オブジェクトも不変です。

内部値はchar配列です。

1

Javaでは、Stringは基本的にchar[]をラップする基本システムクラスです。ほとんどの場合、配列を直接処理するよりもフルクラスを持つ方が望ましい理由はいくつかあります。

  • Stringは不変です。 Stringへの参照があれば、それは決して変わることはないと知っています。
  • Stringはベア配列ができなかった有用な方法、例えばlength()を提供し、明確に定義された比較セマンティクスを持っています。
  • 自分で文字列を終了する必要はありません。
  • Javaでは、文字列連結(+)をサポートするための "演算子のオーバーロードなし"の規則の特別な例外があります。

基本的に、それは同じ場所で所望の動作やデータ構造を収集するためにクラスを使用するのが良いOOの実践だ、とStringは、文字列に対して実行する便利な操作と文字の配列をラップします。

+0

応答いただきありがとうございます。私は別の疑問を持っています - charオブジェクトのようにStringオブジェクトを使用できますか?任意のポイントでランダムな要素にアクセスしたい場合や、任意のインデックスにcharを格納したい場合は、Stringで行うことができますか? – iluvthee07

+0

[The Javadoc](http://docs.oracle.com/javase/7/docs/api/java/lang/String.html)は読む価値があります。 'String'は不変です。つまり、一度作成すると変更できません。 'charAt'はバッキング配列内の個々の文字に読み取り専用アクセスを提供します。 'StringBuilder'(およびより古い、より遅い' StringBuffer')は、 'char []'の周りに読み書きのセマンティクスを提供します。それは、あなたがそれをビルドすると、読み込み専用 'String'に変換できます。 – chrylis

0

文字列オブジェクトを使用する利点は、使用できるすべてのメソッドです。たとえば :

stringExample1.equals(stringExample2); 

String stringExample3 = stringExample1.replace(substring1, substring2); 
1

セマンティック違いがあります。同じようにデータが保存されているからといって、同じことを意味するわけではありません。 DatesAmountsは、同じ内部表現(タイムスタンプまたは固定小額の現金ではlong)でも同じではありません。 charアレイは、16ビットイメージを意味することもできます。オブジェクト指向で

、それは彼らが何であるかに基づいてモデルオブジェクトへの良い練習だとでき、およびない、彼らは内部的に自分のデータを保存する方法によって。 は、のデータ(getter/setterによるアクセスを制限または制御(オブザーバサポート)、または内部表現を不変またはプール可能にする)をカプセル化し、オブジェクトに適切なメソッドを提供することができます。

2

文字列はJavaでは不変であり、Stringプールに格納されます。いったん作成されると、ガーベージが収集されるまでプール内にとどまります。したがって、Stringは不変です。ロギングパスワードは読み取り可能な文字列です。パスワードを見つけるためにメモリダンプを生成するリスクが高くなります。

ここで、文字配列はヒープで作成され、いくつかのダミー値で上書きできます。