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

1.8.Массивы

Простые переменные, содержащие всего одно значение, полезны, но для многих приложений их недостаточно. Скажем, для разработки программы игры в карты требуется множество объектов Card, с которыми можно было бы оперировать как с единым целым. Для таких случаев в языке Java предусмотрены массивы.

Массивом называется набор переменных, относящихся к одному типу. Доступ к элементам массива осуществляется посредством простых целочисленных индексов. В карточной игре объект Deck (колода) может выглядеть так:

class Deck {

final int DECK_SIZE = 52;

Card[] cards = new Card[DECK_SIZE];

public void print() {

for (int i = 0; i < cards.length; i++)

System.out.println(cards[i]);

}

}

Сначала мы объявляем константу с именем DECK_SIZE, содержащую количество кард в колоде. Затем поле cards объявляется в виде массива типа Card— для этого после имени типа в объявлении необходимо поставить квадратные скобки [ и ]. Размер массива определяется при его создании и не может быть изменен в будущем.

Вызов метода print показывает, как производится доступ к элементам массива: индекс нужного элемента заключается в квадратные скобки [ и ], следующие за именем массива.

Как нетрудно догадаться по тексту программы, в объекте-массиве имеется поле length, в котором хранится количество элементов в массиве. Границами массива являются целые числа 0 и length-1. Если попытаться обратиться к элементу массива, индекс которого выходит за эти пределы, то возбуждается исключение IndexOutOfBounds.

В этом примере также демонстрируется новый механизм объявления переменных— переменная цикла объявлена в секции инициализации цикла for. Объявление переменной в секции инициализации— удобный и наглядный способ объявления простой переменной цикла. Такая конструкция допускается лишь при инициализации цикла for; вы не сможете объявить переменную при проверке условия в операторе if или while.

Переменная цикла i существует лишь внутри оператора for. Переменная цикла, объявленная подобным образом, исчезает сразу же после его завершения— это означает, что ее имя может использоваться в качестве имени переменной в последующих операторах цикла.

Упражнение 1.8

Измените приложение Fibonacci так, чтобы найденные числа Фибоначчи сохранялись в массиве и выводились в виде списка значений в конце программы.

Упражнение 1.9

Измените приложение Fibonacci так, чтобы числа Фибоначчи сохранялись в массиве. Для этого создайте новый класс для хранения самого числа и логического значения, являющегося признаком четности, после чего создайте массив для ссылок на объекты этого класса.

1.9.Строковые объекты

Для работы с последовательностями символов в Java предусмотрены тип объектов String и языковая поддержка при их инициализации. Класс String предоставляет разнообразные методы для работы с объектами String.

Примеры литералов типа String уже встречались нам в примерах— в частности, в программе HelloWorld. Когда в программе появляется оператор следующего вида:

System.out.println(“Hello, world”);

компилятор Java на самом деле создает объект String, присваивает ему значение указанного литерала и передает его в качестве параметра методу println.

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

class StringDemo {

static public void main(String args[]) {

String myName = “Petronius”;

myName = myName + “ Arbiter”;

System.out.println(“Name = ” + myName);

}

}

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

Name = Petronius Arbiter

Кроме знака +, в качестве оператора конкатенации можно использовать оператор += как сокращенную форму, в которой название переменной размещается в левой части оператора. Усовершенствованная версия приведенного выше примера выглядит так:

class BetterStringDemo {

static public void main(String args[]) {

String myName = “Petronius”;

String occupation = “Reorganization Specialist”;

myName = myName + “ Arbiter”;

myName += “ ”;

myName += “(” + occupation + “)”;

System.out.println(“Name = ” + myName);

}

}

Теперь при запуске программы будет выведена следующая строка:

Name = Petronius Arbiter (Reorganization Specialist)

Объекты String содержат метод length, который возвращает количество символов в строке. Символы имеют индексы от 0 до length()-1.

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

str = “redwood”;

// ... сделать что-нибудь со str ...

str = “oak”;

второй оператор присваивания задает новое значение ссылки на объект, а не содержимого строки. При каждом выполнении операции, которая на первый взгляд изменяет содержимое объекта (например, использование выше +=), на самом деле возникает новый объект String, также доступный только для чтения,— тогда как содержимое исходного объекта String остается неизменным. Класс StringBuffer позволяет создавать строки с изменяющимся содержимым; этот класс описывается в главе 8, в которой подробно рассматривается и класс String.

Самый простой способ сравнить два объекта String и выяснить, совпадает ли их содержимое, заключается в использовании метода equals:

if (oneStr.equals(twoStr))

foundDuplicate(oneStr, twoStr);

Другие методы, в которых сравниваются части строки или игнорируется регистр символов, также рассматриваются в главе8.

Упражнение 1.10

Измените приложение StringsDemo так, чтобы в нем использовались разные строки.

Упражнение 1.11

Измените приложение ImprovedFibonacci так, чтобы создаваемые в нем объекты String сначала сохранялись в массиве, а не выводились бы сразу же на печать методом println.

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