- char[]に変換して特定の文字を更新、その後Stringオブジェクトに戻す
- byte[]に変換して特定の文字を更新、その後Stringオブジェクトに戻す
- StringBufferを使う
- 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 件のコメント:
コメントを投稿