文字と文字列とはなにが違う?
Javaでは字を扱うときには文字と文字列という二つの型を使います。通常の日本語で書くことを表現するときには
- 字を書く
- 文字を書く
- 文章を書く
などとは言いますが文字列という言葉は馴染みがないと思います。では文字列とはこれらとなにが違うのでしょうか?
Javaやその下になる言語が主に英語話者の間で作られ育ったことをもう一度思い起こしてください。英語では単数と複数と区別していました。同じように文字は単数つまり一文字のことを意味して、文字列は複数の文字が連なったものを表します。
ソースコード上で表現された値をリテラル、literal「文字に関するもの」と呼びます。これはレターとかリテラシーといった言葉にも関連していてラテン語のlittera「文字」から派生しています。
Javaでの文字と文字列の表現の仕方
文字と文字列のリテラルはJavaのソースコード上では区別されています。文字はシングルクオート’で囲み、文字列はダブルクオート”で囲みます。
同様に文字と文字列の型は別のものになっていてます。文字の型はchar、文字列はStringという名前で定義します。
char letter = 'a'; String text = "word";
これも和訳します。
ここで変数letterを定義します。これはchar型つまり文字一つを保持する変数で初期の値を’a’とします。次に変数textを定義します。こちらはString型つまり文字列を保持する変数で初期の値を”word”とします。
当然ですがcharの値として複数文字をシングルクオートで囲むとコンパイルができません。またcharにダブルクオートを使ったり、Stringにシングルクオートを使う事もできません。
文字列は最大で2147483647文字までとされています。文字列の長さを文字長といいます。ここまで多くの文字を入れる事は通常はないと思うので特に気にする必要はないです。
最小は0文字です。この場合特別に「空文字(からもじ)」と呼びます。
String empty = "";
先ほど文字列は複数と言いましたが正確に言うと
文字列は0以上の2147483647以下の数の文字が連なっている集合体である。
と言えます。
なぜcharは小文字で始まりStringは大文字なのか
あと一点不思議に思える点があります。それはcharが小文字でStringが大文字であることです。これはこの二つの値の保持の仕方が違うという事です。これも長くなるので別の機会になりますが簡単に言うと以下の通りです。
charはシンプルな値のためそのまま値を確保している。Stringは値のデータ量が変わるため別な場所コンピュータのメモリ上にその内容を記憶させておいて「どこに記憶しているかの場所を示す情報」だけを持っている。
char型の変数は文字一つ分の記憶スペースを確保すれば良いのですが、文字列は情報量が多くも少なくもなるため記憶スペースをどれだけ確保すればいいのか予想できません。このためメモリ上の空いている場所にまず値を書き込み、その書き込んだ場所を文字列の変数の値として覚えるようにしています。ちょうど大きい荷物を一時預かり所に預けてその証拠として預かり票を受け取るイメージです。必要であればその場所を見に行けば値がそこにあるわけです。
char型のように記憶スペースが一定のものをプリミティブ型、または基本データ型、英語でprimitive typeと呼びます。String型は参照型、英語でreference typeと呼び必要な記憶スペースが型から予想できないものを指します。
プリミティブ型の型名は小文字で参照型の型名(参照型の場合はクラス名とも言います)は大文字で書いて区別がつくようになっているのです。