java.lang.String

Javaには文字列を扱うクラスが幾つかありますが、Stringクラスはその中でも最も基本的なクラスです。
アプリケーションを作成する場合の使用頻度も最も高いことも間違いありません。
Stringクラスは基本ですから充分に理解しておく必要があります。

Unicodeとchar型

Stringクラスの説明の前に文字列というものを考えてみましょう。
文字列とは文字が複数個並んでいるものです。
Javaでは文字はUnicodeで表現され、1文字は2byte(16bit)になります。
従ってJavaでは日本語を含む全角文字・記号・スペースなども含めて文字を"自然に"扱うことができます。

このUnicode文字は、プリミティブ型であるchar型で表されます。
char型を変数として使う場合、代入には文字を'(シングルコーテーション)で囲みます。

    char c = 'a';
    char kanji = '猫';
    char space = ' ';

このように1文字であればUnicodeで定義されている全ての文字を代入できます。
また、文字コードを直接代入するには次のように記述します。

    char c = '\x0041';

Unicode表はWikipediaにもあるので参照してみると良いでしょう。
http://ja.wikipedia.org/wiki/Category:Unicode%E8%A1%A8

文字列

Stringクラスは文字列を扱うクラスです。
標準のクラスライブラリに属していますがクラスである事には変わらないので使用する時にはインスタンスを生成します。

    java.lang.String string = new java.lang.String();

Stringクラスはjava.langパッケージに含まれる為、完全修飾名はjava.lang.Stringです。
しかし、java.langパッケージはデフォルトでimportされているので、import文を書かなくともクラス名だけで使用できます。

    String string = new String();

文字列

JavaではStringクラスを扱う場合、内部的にはインスタンスを生成しますがnewキーワードを使わずに次のように記述できます。

    String string = "Hello World!";

これまで標準出力に出力していた文字列も"(ダブルクオーテーション)で囲っていましたが、実はStringクラスのインスタンス(文字列)だったのです。

文字列の長さ(length)

文字列の長さを取得したい場合、Stringクラスのlength()メソッドを使います。

    String string = "Hello World!";
    // 文字列長を取得
    int size = string.length();

length()メソッドは文字列に含まれる文字(Unicode)の数を取得するメソッドです。
したがって、全角文字も半角文字も1文字として扱いますので注意してください。

文字列の比較(equals)

2つの文字列を比較するには、equals()メソッドを使用します。
equalsメソッドは他の文字列を引数として、文字列が一致する場合にtrueを一致しない場合にfalseを返します。
文字列が等しいという事は2つのインスタンスの文字列長が等しく、順序を含めて文字(Unicode)が全て等しいということです。

    String string1 = "Hello World!";
    String string2 = "Hello World!";
    String string3 = "HELLO WORLD!";
    // 文字列の比較(等しい)
    boolean b1 = string1.equals(string2);
    // 文字列の比較(等しくない)
    boolean b2 = string2.equals(string3);

equalsメソッド

文字列の比較はequalsメソッドを使い行いましたが、実はこのequalsメソッドはStringクラスのメソッドではありません。
equalsメソッドはObjectクラスのメソッドであり、正確なメソッドのシグニチャは次のようになります。

    public boolean equals(Object obj);

StringクラスもObjectクラスのサブクラスですから、Stringクラスではこのメソッドがオーバーライドされている事になります。

このObjectクラスに定義されたequalsメソッドは当然ながら文字列の比較のためにあるものではありません。
もし、そうであるのであればequalsメソッドはStringクラスに定義されているはずです。
それではこのObjectクラスのequalsメソッドとはどのようなメソッドなのでしょうか?

public boolean equals(Object obj)
このオブジェクトと他のオブジェクトが等しいかどうかを示します。

http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/java/lang/Object.html

ここで言うオブジェクトとはインスタンスの事です。
すなわち、インスタンス同士の比較を行い等しいかを比較判定するメソッドです。

どのような時にインスタンス(オブジェクト)が等しいかはそのクラスによって異なります。
JavaDocによればStringクラスのequalsは次のように定義されています。

この文字列と指定されたオブジェクトを比較します。引数が null でなく、このオブジェクトと同じ文字シーケンスを表す String オブジェクトである場合にだけ、結果は true になります。

http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/java/lang/String.html#equals(java.lang.Object)

尚、比較演算子の==はインスタンス自体が同じものかの比較を行います。
つまり、一般的には==がtrueの場合(同一インスタンス)にはequalsはtrueになりますが、equalsがtureだとしても==がtrueであるとは限りません。

文字列の連結

文字列に関しては様々な便利な機能が提供されており、その1つが文字列同士の連結です。
文字列(Stringクラスのインスタンス)同士は+演算子を使うことで簡単に連結することが可能です。

    String string = "Hello " + "World!";

変数同士の連結も可能です。

    String hello = "Hello ";
    String world = "World!";
    String string = hello + world;

ここで注意しなくてはならないことがあります。
new演算子を使っていないので解りにくいのですが、文字列の連結を行うと新しいインスタンスが作成さます。

"Hello "を表すインスタンスと"World!"を表すインスタンスがあり、stringに代入されるときに新らしいインスタンス"Hello World!"を表すインスタンスが生成されます。
このようにStringクラスのインスタンスは文字列毎に生成されます。
言い換えれば、Stringクラスのインスタンスは一度生成されると、二度と変更することができません。
このようなStringクラスは不変オブジェクトと呼ばれています。

不変オブジェクトは通常のオブジェクト(インスタンス)に対して非常に単純な構造となります。
リードオンリーである為に、更新するときの競合の問題(スレッド・セーフ)もありませんし、同じ値を持つインスタンスであれば共有することでメモリを効率良く使うことも出来ます。

これは文字列の連結を行う時に充分に注意しなくてはなりません。

    String string = "Hello" + " " + "World!";

この時に生成されるインスタンスは5つです。
最初に"Hello", " ", "World!"のそれぞれを表すインスタンスが生成されます。
次に最初の+演算子が処理され、"Hello "を表すインスタンスが生成されます。
最後に後ろの+演算子が処理され、"Hello World!"を表すインスタンスが生成されます。

固定文字列と可変文字列

Stringクラスは文字列を扱うクラスなので、今までのクラスと同様に考えるならばStringクラスにsetChar(cahr c)やaddChar(cahr c)などのメソッドがあり、文字列(char)を追加していくものと考えるでしょう。
この考え方はオブジェクト指向としては正しいと言えます。
しかし、文字列を扱う毎にこのような操作をするのは非常に煩雑とも言えます。

そこでStringクラスでは固定文字列を持つインスタンス(変更できない)のみ生成出来るとし、可変文字列に関してはjava.lang.StringBufferクラスを用意して役割を明確にしています。