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

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. Если значения аргументов offset и coun t заставляют конструктор обратиться к элементам, выходящим за границы массива, возбуждается исключение IndexOutOfBounds.

public String(byte[] bytes, int hiByte)

Сокращенная форма для String(bytesm hibyte, 0, bytes.length).

public void int  getBytes(int srcBegin, int srcEnd, byte[] dst, 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.

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