JDK1.6 и JDK1.7 принципы и различия в подстроки

 

substring(int beginIndex, int endIndex)Реализация в различных версиях JDK отличается. Узнайте разницу между ними может помочь вам лучше использовать его. Для простоты, в дальнейшем с substring()представительными substring(int beginIndex, int endIndex)методами.

подстрока () действия

substring(int beginIndex, int endIndex)Метод перехвата и возвращает строку [beginIndex, ENDINDEX-1] в диапазоне содержания.

String x = "abcdef";
x = x.substring(1,3);
System.out.println(x);

Содержание Выход:

bc

Что происходит , когда вы называете подстроку () вверх?
Как вынаверноезнаете, потому что х неизменна, когдаx.substring(1,3)время присвоения х, он будет указывать на новую строку:

Однако эта цифра не совсем правильное представление о том, что произошло кучу. Потому что то, что происходит, когда вы звоните подстроку в JDK6 и jdk7 не то же самое.

JDK 6, в подстроки

Строка достигается массив символов. В JDK 6 класс Строка содержит три члена char value[]переменные:  int offset, int count,. Они используются для хранения реального массива символов, индекс массива на первую позицию и количество символов , содержащихся в строке.

При вызове метода подстроки создает новый объект строки, но значение строки по-прежнему указывает на кучу того же массива символов. Оба объекта рассчитывать только и значение смещения различно.

Вот ключ к коду, сказала точка зрения доказательства в исходном коде Java:

//JDK 6
String(int offset, int count, char value[]) {
    this.value = value;
    this.offset = offset;
    this.count = count;
}

public String substring(int beginIndex, int endIndex) {
    //check boundary
    return  new String(offset + beginIndex, endIndex - beginIndex, value);
}

JDK 6 выпуск подстроки вызвало

Если у вас есть очень, очень длинная строка, но когда вы используете подстроку вам просто нужно вырезать очень короткий период. Это может привести к проблемам с производительностью, потому что все, что вам нужно, это короткая последовательность символов, но вы процитировали всю строку (из-за этого очень длинный массив символов были процитировано, он не может быть восстановлен, это может привести к утечке памяти). В JDK 6, как правило, следующим образом, чтобы решить эту проблему, на самом деле, принцип заключается в создании новой строки и цитировал его.

x = x.substring(x, y) + ""

О ненадлежащем использовании JDK 6 в серии причины памяти подстроки было официально зарегистрировано в базе данных ошибок в Java:

утечка

Утечки памяти: В информатике, память утечки, что из-за небрежности или ошибки программы не удается освободить память больше не используется. Утечка памяти не относится к физической памяти в исчезновении, но применение по истечению определенного периода распределения памяти, из-за конструктивными ошибки, в результате чего в период до освобождения памяти теряет контроль сегмента памяти, в результате чего отходов памяти.

JDK 7 подстрока

Проблемы, упомянутые выше, решена в JDK 7. В JDK 7, метод подстрока создает новый массив в динамической памяти.

строка-подстрока-jdk7

Java исходный код для основной части об этом следующим образом:

//JDK 7
public String(char value[], int offset, int count) {
    //check boundary
    this.value = Arrays.copyOfRange(value, offset, offset + count);
}

public String substring(int beginIndex, int endIndex) {
    //check boundary
    int subLen = endIndex - beginIndex;
    return new String(value, beginIndex, subLen);
}

Этот метод подстроки в JDK 7, его использование new Stringсоздает новую строку , чтобы избежать ссылок на старую строку. Таким образом , чтобы решить проблему утечки памяти.

Таким образом, версия JDK, если ваша рабочая среда используется меньше, чем 1,7, при использовании методов Строки подстроки должны обратить внимание, чтобы избежать утечек памяти.

рекомендация

отwww.cnblogs.com/lujiahua/p/11408654.html
рекомендация