К. Арнольд, Д. Гослинг - Язык программирования Java, страница 9
Описание файла
PDF-файл из архива "К. Арнольд, Д. Гослинг - Язык программирования Java", который расположен в категории "". Всё это находится в предмете "языки программирования" из 7 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст 9 страницы из PDF
Любые две строки с одинаковым содержимым будут иметь одинаковое значение хешкода, хотя и две разные строки тоже могут иметь одинаковый хеш-код. Хеш-коды нужны для работы с хеш-таблицами, такими, например, как вклассе 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 предполагает, что в исходной строке имеется всего один экземпляр подстроки с заданными символамиограничителями. Напишите версию метода, которая извлекает все такие строки и возвращает массив.8.5. Преобразование строкДовольно часто возникает необходимость преобразовать строку в значение другого типа (скажем, целого или логического) или наоборот.Согласно конвенции, принятой в Java, тип, к которому преобразуется значение, должен содержать метод, выполняющий преобразование.Например, преобразование из типа String в Integer должно выполняться статическим методом класса Integer.
Ниже приводится таблица всехконвертируемых типов, а также способы их преобразования в тип String и обратно:ТипВ StringИз StringbooleanString.valueOf(boolean)new Boolean(String).booleanValue()intString.valueOf(int)Integer.ParseInt(String, int base)longString.valueOf(long)Long.ParseLong(String, int base)floatString.valueOf(float)new Float(String).floatValue()doubleString.valueOf(double)new Double(String).doubleValue()Для логических значений, а также для значений с плавающей точкой сначала создается объект Float или Double, после чего определяется егочисленное значение.
Для значений с плавающей точкой не существует эквивалента метода parseInt, который напрямую выделяет значение изстроки.Не существует методов, которые переводили бы символы из форм, распознаваемых языком Java (\b, \udddd и т. д.) в переменные типа char илинаоборот. Вы можете вызвать метод String.valueOf для отдельного символа, чтобы получить строку, состоящую из одного данного символа.Также не существует возможности создать или преобразовать числовые строки в формат языка Java, в котором начальный 0 означаетвосьмеричную запись, а 0x — шестнадцатеричную.Преобразования в byte и short, а также обратные им производятся через тип int, поскольку соответствующие значения всегда лежат в диапазонеint; к тому же при использовании этих типов в вычисляемых выражениях они все равно преобразуются в int.Новые классы также могут поддерживать строковые преобразования; для этого в них следует включить метод toString и конструктор, которыйсоздает новый объект по строковому описанию.
Классы, включающие метод toString, могут использоваться в valueOf. В соответствии сопределением метода valueOf(Object obj), он возвращает либо строку “null”, либо obj.to String. Если все классы в вашей программе содержатметод toString, то вы сможете преобразовать любой объект в тип String вызовом valueOf.8.6. Строки и символьные массивыСодержимое строки может отображаться на символьный массив и наоборот. Часто в программе бывает необходимо предварительно построитьстроку в массиве char, после чего создать объект String по содержимому этого массива.
Если описанный ниже класс StringBuffer (допускающийзапись в строки) в каком-то конкретном случае не подходит, существует несколько методов и конструкторов класса String, помогающихпреобразовать строку в массив char или же массив char — в строку.Например, чтобы удалить из строки все вхождения определенного символа, можно воспользоваться следующим несложным алгоритмом:public static String squeezeOut(String from, char toss) {char[] chars = from.toCharArray();int len = chars.length;for (int i = 0; i << len; i++) {if (chars[i] == toss) {--len;System.arraycopy(chars, i + 1,chars, i, len - i);--i;// рассмотреть повторно}}return new String (chars, 0, len);}Метод squeezeOut сначала преобразует свою входную строку from в символьный массив при помощи метода toCharArray. Затем он в циклеперебирает элементы массива в поисках символа toss. Когда такой символ находится, длина возвращаемой строки уменьшается на 1, а всеследующие символы массива сдвигаются к началу.
Значение i уменьшается, чтобы можно было проверить новый символ в позиции i и выяснить,не следует ли удалить и его. Когда метод завершает просмотр массива, он возвращает новый объект String, содержащий “выжатую” строку. Дляэтого применяется конструктор String, которому в качестве аргументов передается исходный массив, начальная позиция внутри массива иколичество символов.Кроме того, имеется отдельный конструктор String, который получает в качестве параметра только символьный массив и использует егоцеликом. Оба этих конструктора создают копии массива, так что после создания String можно изменять содержимое массива — на содержимоестроки это не повлияет.При желании вместо конструкторов можно воспользоваться двумя статическими методами String.copyValueOf.
Например, метод squeezeOut могбы заканчиваться следующей строкой:return String.copyValueOf(chars, 0, len);Вторая форма copyValueOf получает один аргумент и копирует весь массив. Для полноты было решено сделать два статических метода copyValueOf эквивалентными двум конструкторам String.Метод toCharArray прост и достаточен в большинстве случаев. Когда желательно иметь больше возможностей для контроля за процессомкопирования фрагментов строки в символьный массив, можно воспользоваться методом getChars:public void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)Копирует символы из строки в массив. Символы заданной подстроки копируются в массив начиная с dst[dstBegin]. Подстрока представляет собойфрагмент исходной строки, который начинается с позиции srcBegin и заканчивается на srcEnd (но не включает ее!).
Любая попытка выхода запределы строки или массива char приводит к возбуждению исключения IndexOutOfBoundsException.8.7. Строки и массивы byteСуществуют методы, предназначенные для преобразования массивов 8-разрядных символов в объекты String в 16-разрядной кодировке Unicodeи наоборот. Эти методы помогают создавать строки Unicode из символов ASCII или ISO-Latin-1, которые являются первыми 256 символами внаборе Unicode. Данные методы аналогичны своим прототипам, предназначенным для работы с символьными массивами:public String(byte[] bytes, int hiByte, int offset, int count)Конструктор создает новую строку, состоящую из символов заданного подмассива, входящего в массив bytes с позиции offset и состоящего изcount символов. Старшие 8 бит каждого символа могут быть заданы в переменной hiByte, значение которой обычно равно 0, так как конструкторчаще всего используется для преобразования символов 8-разрядной кодировки ASCII или ISO-Latin-1 в 16-разрядные строки Unicode.