четверг, 16 мая 2013 г.

Как работает substring для объектов String в Java?

Как работает метод substring для объектов String в Java?

Ответ

Работа метода substring зависит от версии Java. Начиная с версии 7u6, после вызова метода substring создается новый объект String, через конструктор

public String(char value[], int offset, int count) {
    ...
    ...
    this.value = Arrays.copyOfRange(value, offset, offset+count);
}
где char value[] исходный массив символов строки, offset - смещение и count - количество символов. Из кода видно, что создается новый массив, хранящий символы. В версиях до Java 7u6 дела обстоят иначе: так же создается новый объект String, но используется старый массив char value[].

// Package private constructor which shares value array for speed.
String(int offset, int count, char value[]) {
    this.value = value;
    this.offset = offset;
    this.count = count;
}
Т.е. если исходная строка имеет очень большой размер, то создав короткий substring от нее, мы будем хранить в памяти большой массив из-за оставшейся на него ссылки. Это не позволяет сборщику мусора собрать оригинальную строку, из-за чего может возникнуть утечка памяти. Изначально это было сделано для ускорения создания подстрок, но было отмечено как баг и устранено в версии Java 7u6.

Комментариев нет:

Отправить комментарий