Наткнулся тут на статью по утечке памяти из-за substring.
В статье утверждалось:
String original = "java", собственно, состоит из массива {'j', 'a', 'v', 'a'}, где offset = 0, а count = 4 (т.е последний элемент)
И когда мы делаем substring, то новая строка содержит старый массив, просто меняет свой offset и count на аргументы, указанные в методе. И если original большая, то substring будет содержать весь массив, отсюда утечка памяти
Пошел гуглить, наткнулся еще на одну статью. Там говорится, что, мол, новая строка с substring содержит не старый массив, а лишь ссылку на него. Т.е тут по памяти все чики-пуки, если не считать того, что, как мне кажется, в таком случае GC не сможет собрать строку original.
Залез в класс String JDK 8. Что нашел:
substring в конце возвращает:
new String(value, beginIndex, subLen)
идем в конструктор:
this.value = Arrays.copyOfRange(value, offset, offset+count);
То есть в JDK 8, в итоге, строка от substring будет содержать нужную часть оригинального массива, верно? Я ничего не путаю?
И данные из статей - получается, из JDK 6 и 7 что ли?