Главная » Просмотр файлов » К. Арнольд, Д. Гослинг - Язык программирования Java

К. Арнольд, Д. Гослинг - Язык программирования Java (1160779), страница 10

Файл №1160779 К. Арнольд, Д. Гослинг - Язык программирования Java (К. Арнольд, Д. Гослинг - Язык программирования Java) 10 страницаК. Арнольд, Д. Гослинг - Язык программирования Java (1160779) страница 102019-09-19СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 10)

Еслизначения аргументов offset и coun t заставляют конструктор обратиться к элементам, выходящим за границы массива, возбуждается исключениеIndexOutOfBounds.public String(byte[] bytes, int hiByte)Сокращенная форма для String(bytesm hibyte, 0, bytes.length).public void getBytes(int srcBegin, int srcEnd, byte[] dst, •• int dstBegin)Создает копию фрагмента строки в массиве dst, начиная с dst[dstBegin]. При этом теряются старшие 8 бит каждого символа.

Копированиепроизводится с позиции srcBegin и заканчивается в srcEnd (но не включает ее!). Любая попытка выхода за пределы строки или массива charприводит к возбуждению исключения IndexOutOfBoundsException.Оба конструктора String, создающих строки по содержимому массива byte, производят копии данных, так что дальнейшие изменениясодержимого массива никак не отражаются на содержимом строки.8.8. Класс StringBufferЕсли бы программисты могли работать исключительно со строками, доступными только для чтения, приходилось бы создавать новый объектString для каждого промежуточного результата при последовательных операциях со строками. Например, давайте задумаемся над тем, каккомпилятор будет вычислять следующее выражение:public static String guillemete(String quote) {return '"' + quote + '"';}Если бы компилятор ограничивался выражениями типа String, он действовал бы следующим образом:quoted = String.valueOf('"').concat(quote).concat(String.valueOf('"'));При каждом вызове valueOf и concat создается новый объект String; следовательно, в результате подобной операции появятся четыре объектаString, из которых в дальнейшем будет использован только один.

Что касается остальных, то их создание, присвоение начальных значений иудаление будет сопряжено с непроизводительными расходами.Разумеется, компилятор действует значительно эффективнее. Для построения промежуточных строк используются объекты класса StringBuffer, аитоговые объекты String создаются лишь в случае необходимости. Объекты StringBuffer могут изменяться, поэтому для хранения промежуточныхрезультатов не нужны новые объекты. При помощи StringBuffer приведенное выше выражение может быть представлено в следующем виде:quoted = new StringBuffer().append('"')..append(quote).append('"').toString();В этом варианте создается всего один объект StringBuffer, который хранит строку, добавляет к ней новые фрагменты и пользуется методомtoString для преобразования результатов своей работы в объект String.Для построения и модификации строки можно воспользоваться классом StringBuffer.

Класс StringBuffer содержит следующие конструкторы:public StringBuffer()Конструирует новый объект StringBuffer, начальное значение которого равно “”.public StringBuffer(String str)Конструирует новый объект StringBuffer, исходное значение которого совпадает с str.Класс StringBuffer во многих отношениях напоминает класс String, а многие из содержащихся в нем методов имеют те же имена и контракты, что иметоды String.

Тем не менее StringBuffer не является расширением String, и наоборот. Оба этих класса являются независимыми расширениямикласса Object.8.8.1. Модификация буфераСуществует несколько возможностей изменить содержимое буфера объекта StringBuffer, в том числе добавить новые символы в его конец иливставить их в середину. Самый простой из таких методов называется setCharAt и служить для замены символа в конкретной позиции. Такжеимеется метод replace, который делает то же самое, что и String.replace, однако работает с объектом StringBuffer.

Метод replace не нуждается всоздании нового объекта для хранения результата, поэтому несколько последовательных вызовов replace могут выполняться с одним буфером:public static voidreplace(StringBuffer str, char from, char to){for (int i = 0; i << str.length(); i++)if (str.charAt(i) == from)str.setCharAt(i, to);}Метод setLength обрезает или расширяет строку, хранящуюся в буфере. Если передать setLength величину, меньшую длины текущей строки, тострока будет обрезана до указанного значения.

Если же передаваемая длина превышает текущую, то строка расширяется, а новые позициизаполняются нуль-символами (\u0000).Кроме того, имеются методы append и insert, которые преобразуют данные любого типа в String, после чего присоединяют результатпреобразования к концу строки либо вставляют его в середину. При выполнении метода insert существующие символы сдвигаются, чтобыосвободить место для вставляемых новых символов.

Методы append и insert преобразуют данные следующих типов:ObjectbooleanlongStringchar intfloatchar[]intdoubleТакже существуют методы append и insert, которым в качестве аргумента передается часть массива char. Например, для создания объекта StringBuffer с описанием квадратного корня из целого числа можно написать следующее:String sqrtInt(int i) {StringBuffer buf = new StringBuffer();}buf.append("sqrt(").append(i).append(')');buf.append(" = ").append(Math.sqrt(i));return buf.toString();Методы append и insert возвращают исходный объект String, что в данном случае позволяет нам добавить новые символы к результатупредыдущего действия.Метод insert получает два параметра.

Первый из них — позиция, начиная с которой в StringBuffer будут вставляться новые символы. Второйпараметр — вставляемое значение, при необходимости преобразованное в String. Приведем метод, который вставляет добавляет дату в началобуфера:public static StringBuffer addDate(StringBuffer buf) {String now = new java.util.Date().toString();buf.ensureCapacity(buf.length() + now.length() + 2);buf.insert(0, now).insert(now.length(), ": ");return buf;}Все начинается с создания строки, содержащей текущую дату. Для этой цели используется класс java.util.Date; его конструктор по умолчаниюсоздает объект, представляющий текущее время на момент создания.

Далее необходимо убедиться, что размеров буфера хватит для хранениявсех добавляемых символов — увеличение буфера должно происходить только один раз, а не после каждого вызова insert. Затем в буфервставляется строка с текущим временем, за которой следует простейшая строка-разделитель.

Наконец, переданный буфер возвращаетсяобратно, чтобы при вызове данного метода можно было осуществить что-нибудь наподобие той конкатенации, которая пригодилась при работес собственными методами StringBuffer.Метод reverse изменяет порядок следования символов в StringBuffer.

Например, если буфер содержит строку “good”, то после выполненияreverse в нем окажется строка “doog”.8.8.2. Извлечение данныхЧтобы создать объект String на основе объекта StringBuffer, следует вызвать метод toString.В StringBuffer не существует методов, которые бы удаляли часть содержимого буфера — вам придется преобразовать буфер в символьныймассив, удалить то, что нужно, и построить новый буфер по массиву с оставшимися символами. Вероятно, для этого следует воспользоватьсяметодом getChars, который аналогичен методу String.getChars.public void getChars(int srcBegin, int srcEnd, char[] dst, •• int dstBegin)Копирует символы из заданной части буфера (определяемой позициями srcBegin и srcEnd) в массив dst начиная с dst[dstBegin].

Копированиеведется с позиции srcBegin до srcEnd (но не включает ее!). Позиция srcBegin должна представлять собой допустимый индекс для данного буфера,а позиция srcEnd не может превышать длины текущей строки в буфере (которая на единицу больше, чем последний индекс). Если какой-либо изиндексов окажется недопустимым, возбуждается исключение Inde x OutOfBoundsException.Приведем метод, в котором getChars используется для удаления части содержимого буфера:public static StringBufferremove(StringBuffer buf, int pos, int cnt){if (pos << 0 || cnt << 0 || pos + cnt >> buf.length())throw new IndexOutOfBoundsException();int leftover = buf.length() - (pos + cnt);if (leftover == 0) {// простое обрезание строкиbuf.setlength(pos);return buf;}}char[] chrs = new char[leftover];buf.getChars(pos + cnt, buf.Length(), chrs, 0);buf.setLength(pos);buf.append(chrs);return buf;Прежде всего необходимо убедиться в том, что значения индексов массива не выходят за пределы допустимых. Обработать исключение можно ипозднее, однако немедленная проверка позволяет лучше контролировать ситуацию.

Затем мы вычисляем, сколько элементов находится послеудаляемой части массива; если таких элементов нет, обрезаем буфер и возвращаемся. В противном случае, перед тем как возвращаться изметода, необходимо выделить эти символы методом getChars, затем обрезать буфер и приписать к нему выделенный ранее остаток.8.8.3. Работа с емкостью буфераБуфер объекта StringBuffer обладает определенной емкостью — так называется максимальная длина строки, которая может поместиться в немперед тем, как придется выделять дополнительное место. Буфер может увеличиваться автоматически по мере добавления новых символов,однако для повышения эффективности желательно установить его размер один раз.Исходный размер буфера объекта StringBuffer может быть задан с помощью конструктора, получающего всего один параметр типа int:public StringBuffer(int capacity)Конструирует новый объект StringBuffer с заданной исходной емкостью и начальным значением “”.public synchronized void ensureCapacity(int minimum)Позволяет убедиться в том, что буфер имеет емкость не менее заданного minimum.public int capacity()Возвращает текущую емкость буфера.С помощью этих методов можно избежать многократного увеличения буфера.

Характеристики

Тип файла
PDF-файл
Размер
1,1 Mb
Тип материала
Высшее учебное заведение

Список файлов книги

Свежие статьи
Популярно сейчас
Зачем заказывать выполнение своего задания, если оно уже было выполнено много много раз? Его можно просто купить или даже скачать бесплатно на СтудИзбе. Найдите нужный учебный материал у нас!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6418
Авторов
на СтудИзбе
307
Средний доход
с одного платного файла
Обучение Подробнее