(もともと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();