StringBufferをStringに書き換えるときは参照に注意JavaTips 〜Javaプログラミング編

» 2006年09月13日 10時00分 公開
[平野正喜@IT]

 Stringクラスは固定文字列を、StringBufferクラスは可変文字列を実装するクラスですが、簡単な文字列の操作では、どちらを使っても同様の結果を得られます。しかし、Javaでは文字列リテラルはStringクラスのオブジェクトとして扱われますので、特に必要がなければStringクラスを用いた方がプログラムがシンプルになります。

 例えば、下記のプログラムがあるとしましょう。

StringBufferクラスを使った文字列処理プログラム(主要部分のみ) StringBufferクラスを使った文字列処理プログラム(主要部分のみ)

 このプログラムで行っている文字列操作は連結だけですので、Stringクラスを用いるように書き換えることができます。しかし、書き換えると違う結果になってしまいます。

Stringクラスで書き換えたプログラム(失敗例) Stringクラスで書き換えたプログラム(失敗例)

 この違いが起こる原因は、Stringクラスのオブジェクトが不変であり、文字列の操作により参照が変化してしまうことにあります。

 具体的には、swがStringBufferクラスの参照変数である場合の「sw.append("文字列");」と、Stringクラスである場合の「sw += "文字列";」は、どちらも、文字列を連結し、連結結果をswで参照します。しかし、実行後と実行前のswの参照先は、前者では変わりませんが、後者では変わってしまうのです。なお、これは後者を「sw = sw + "文字列";」や「sw = sw.concat("文字列");」とした場合も同様です。

 Stringクラスのオブジェクトでは(文字列リテラルも)、文字列操作の結果が常に新しいStringオブジェクトとなることに注意しましょう。

 なお、元のプログラムの動作を変えずに、Stringクラスを用いるように書き換えると、以下のようになります(一例)。

Stringクラスで書き換えたプログラム(一例) Stringクラスで書き換えたプログラム(一例)

Profile

RunDog.org

平野正喜


Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。