1. yyoshikaw

    Posted

    yyoshikaw
Changes in title
+String#substringによるメモリリークの可能性
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,23 @@
+String#substringは新しい文字列をnew Stringで生成するにも関わらず切り出し前の文字列を内部(のchar配列)で保持してしまっています。
+
+本内容は通常は意識する必要はありませんが、巨大な文字列をsubstring操作する際はメモリリーク等につながる場合がありますので注意が必要です。
+(String#splitにも同様の問題があります)
+
+```java
+String s1 = "0123456789"; // -> s1内部で保持しているchar配列は {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
+
+String s2 = str.substring(5); // -> s2内部で保持しているchar配列は {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} ({5, 6, 7, 8, 9}ではない!)
+
+System.out.println(s2); // -> "56789"
+
+```
+
+```java
+// 対処方法1
+String s3 = new String(s1.substring(5));
+```
+
+```java
+// 対処方法2
+String s4 = s1.substring(5).intern();
+```