Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
GoslingJava2.doc
Скачиваний:
139
Добавлен:
23.02.2016
Размер:
2.39 Mб
Скачать

8.3. Вспомогательные методы

Класс String содержит два метода, которые оказываются полезными в специализированных приложениях. Один из них— hashCode, который возвращает хеш-код, основанный на содержимом строки. Любые две строки с одинаковым содержимым будут иметь одинаковое значение хеш-кода, хотя и две разные строки тоже могут иметь одинаковый хеш-код. Хеш-коды нужны для работы с хеш-таблицами, такими, например, как в классе Hashtable из java.util.

Второй вспомогательный метод, intern, возвращает строку, содержимое которой совпадает с содержимым исходной строки. Однако для любых двух строк с одинаковым содержимым intern возвращает ссылку на один и тот же объект String, что позволяет проверять равенство строк посредством сравнения ссылок вместо более медленной проверки содержимого строк. Рассмотрим пример:

int putIn(String key) {

String uniqe = key.intern();

int i;

// проверить, имеется ли такой элемент в таблице

for ( i = 0; i << tableSize; i++)

if (table[i] == unique)

return i;

// если нет - добавить

table[i] = unique;

tableSize++;

return i;

}

Все строки, хранящиеся в массиве table, получены в результате вызова intern. Массив просматривается в поисках строки, содержимое которой совпадает с key. Если строка найдена, то поиск завершается. Если же такой строки нет, в конец массива добавляется строка, содержимое которой совпадает с содержимым key. При работе с результатами вызовов intern сравнение ссылок на объекты эквивалентно сравнению содержимого строк, однако происходит существенно быстрее.

8.4. Создание производных строк

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

public static String quotedString(

String from, char start, char end)

{

int startPos = from.indexOf(start);

int endPos = from.lastIndexOf(end);

if (startPos == -1) // начальный символ не найден

return null;

else if (endPos == -1) // конечный символ не найден

return from.substring(startPos);

else // найдены оба символа-ограничителя

return from.substring(startPos, endPos + 1);

}

Метод quotedString возвращает новый объект String, который содержит фрагмент строки from, начинающийся с символа start и заканчивающийся символом end. Если найден символ start, но не найден end, то метод возвращает новый объект String, содержащий все символы от начальной позиции до конца строки. В работе quotedString используются две перегруженные формы метода substring. Первая из них получает только начальную позицию в строке и возвращает новую строку, содержащую все символы с заданной позиции, и до конца строки. Вторая форма получает и начальную, и конечную позиции и возвращает новую строку, содержащую все символы между соответствующими позициями исходной строки; при этом начальный символ-ограничитель включается в подстроку, а конечный— нет. Именно из-за этого принципа “до конца, но не включая конец” мы и прибавляем единицу к endPos, чтобы в подстроку вошли оба символа-ограничителя. Например, вызов

quotedString(“Il a dit “Bonjour!””, ‘“’, ‘”’);

возвращает строку

“Bonjour!”

Ниже перечисляются остальные методы для создания производных строк:

public String replace(char oldChar, char newChar)

Возвращает новый объект String, в котором все вхождения символа old Char заменяются символом newChar.

public String toLowerCase()

Возвращает новый объект String, в котором каждый символ преобразуется в эквивалентный ему символ нижнего регистра (если он имеется).

public String toUpperCase()

Возвращает новый объект String, в котором каждый символ преобразуется в эквивалентный ему символ верхнего регистра (если он имеется).

public String trim()

Возвращает новый объект String, в котором удалены все пробелы в начале и конце строки.

Метод concat возвращает новую строку, которая эквивалентна применению оператора + к двум строкам. Следующие два оператора являются эквивалентными:

newStr = oldStr.concat(“ (not)”);

newStr = oldStr + “ (not)”;

Упражнение 8.3

Как показано выше, метод quotedString предполагает, что в исходной строке имеется всего один экземпляр подстроки с заданными символами- ограничителями. Напишите версию метода, которая извлекает все такие строки и возвращает массив.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]