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, метод подстрока создает новый массив в динамической памяти.
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, при использовании методов Строки подстроки должны обратить внимание, чтобы избежать утечек памяти.