覚えたら書く

IT関係のデベロッパとして日々覚えたことを書き残したいです。twitter: @yyoshikaw

Java 6 - String#substringによるメモリリークの可能性

(もともとQiitaに書いていたものを、ここに移動させました。)


※以下Java 6までの問題です。Java 7では解決されています


String#substring は新しい文字列を new String で生成するにも関わらず切り出し前の文字列を内部(のchar配列)で保持してしまっています。

本内容は通常は意識する必要はありませんが、巨大な文字列をsubstring操作する際はメモリリーク等につながる場合がありますので注意が必要です。
(String#splitにも同様の問題があります)

String s1 = "0123456789";       // -> s1内部のchar配列は {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

String s2 = s1.substring(5);   // -> s2内部のchar配列は {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} ({5, 6, 7, 8, 9}ではない!)

System.out.println(s2);         // -> "56789"
// 対処方法1
String s3 = new String(s1.substring(5));
// 対処方法2
String s4 = s1.substring(5).intern();