Search on the blog

2012年2月4日土曜日

Javaで文字列の変更

Javaのメモ。「Stringで渡された文字列をある条件を満たすように回文にしてStringで返せ」という問題があって、文字列の一部を変更したい場合どうするんだっけ?となったので、いくつかやってみた。
  1. char[]に変換して特定の文字を更新、その後Stringオブジェクトに戻す
  2. byte[]に変換して特定の文字を更新、その後Stringオブジェクトに戻す
  3. StringBufferを使う
  4. Stringbuilderを使う
まず、1.のやり方。簡単のため、"hogehoge2011"を"hogehoge2012"にする場合を考えます。
public static void main(String args[]) {
    String hoge = "hogehoge2011";
    
    char []chrs = hoge.toCharArray();
    chrs[chrs.length-1] = '2';
    hoge = new String(chrs);
    
    System.out.println(hoge);
}


char[]からStringに戻すときは、Stringコンストラクタにchar[]を渡してあげます。

hoge = chrs.toString();
や、
hoge = Arrays.toString(chrs);

を使ってしまいそうになりますが、間違いです。前者は、ObjectクラスのtoString()が呼ばれ「オブジェクトの派生元のクラス名、アットマーク (@)、およびオブジェクトのハッシュコードの符号なし 16 進表現から構成される文字列」を返します。こんなのがhogeに代入されます。

[C@10b30a7

また、後者のArrays.toString(chr)の場合は、以下のような文字列がhogeに代入されます。

[h, o, g, e, h, o, g, e, 2, 0, 1, 2]

ということで、char[]からStringにC++のような代入をしたい場合は、Stringのコンストラクタを使うようです。

2.は1.と同様です。Javaのcharは2バイトの領域を持っています。これに対してbyteは1バイトなので、文字コードが1バイトに収まる文字だけが対象の場合は、byte[]で扱った方が効率的です。

3. StringBufferオブジェクトを利用したやり方です。
    public static void main(String args[]) {
        String hoge = "hogehoge2011";
        
        StringBuffer sb = new StringBuffer(hoge);
        sb.setCharAt(sb.length()-1, '2');
        hoge = sb.toString();
        System.out.println(hoge);
    }

4. StringBuilderを利用したやり方は、StringBufferの場合と同様なので省略します。両者の違いが気になりますが、以下のような違いがあります。
  • 提供する機能は同じ
  • StringBuilderは高速だが、同期を保証しない
  • StringBufferは同期を保証するが、低速
ということで、可能な場合はStringBuilderの使用が推奨されています。

0 件のコメント:

コメントを投稿