2008年07月26日

Javaにおける文字列の扱いとStringBuffer

C++ではSTLにて利用可能なstringクラスがある。従来のC言語では文字列の長さの取得をstrlen()、文字列の比較をstrcmp等で行っていたが、stringクラスを利用することにより、実装されたメソッドやオーバーロードにより文字列操作を行うことが可能である。同様の機能としてJavaにもStringクラスが存在するがC++といくつか異なる点がある。

//C++
cout << "Hello, World" << endl;       //(1)
//Java
System.out.println("Hello, World");   //(2)

(1)のコードはC++で書かれたものである。C++では二重引用符で囲まれたものは処理系依存であるが基本的にconst char*として扱われる。(2)はJavaで書かれたもので、Javaでは二重引用符で囲まれたものはStringオブジェクトとして扱われる。ここが大きな差である。なので以下のようなコードも文法上全く問題無いのである。

System.out.println("Hello, World".length());   //Stringメソッドのlength()を呼び出している

実行結果

12

次に+=演算子等の扱いについて。

//C++
string str("Hello, ");
str += "World";  //(3)

//Java
String str = new String("Hello, ");
str += "World";  //(4)

(3)ではconst char*型である右辺値をstring型オブジェクトである左辺値strでオーバーロードされた+=演算子にてstrのデータを直接書き換えているが、(4)では、String型である右辺値をString型である左辺値の末端に付け加えたオブジェクトを新たに生成し、それを左辺値に代入を行っているのである。これが意図することは、Javaにてforやwhile等でString型のオブジェクトに対して新たな文字列を逐次付け加える処理を行った場合、その都度メモリに新しいオブジェクトが生成されることを意図している。Javaではガーベージコレクタを実装しているので、参照が無効となった時点でメモリが解放されることになっているが、パフォーマンス的に言うならよろしくない。そこでJavaでは文字列の付け加えを行う場合にはStringBufferクラスの使用を推奨している。
もう一つとして、C++では文字列の終端文字として\0を原則としていたが、Javaでは基本的に終端文字は存在しないのである。これは終端文字の役割を考えれば明らかであるが、標準の文字列としてStringオブジェクトを扱うJavaには、そもそも終端文字が必要ないのである。
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック
×

この広告は90日以上新しい記事の投稿がないブログに表示されております。