Кен Арнольд Джеймс Гослинг
Вид материала | Документы |
Содержание1.9. Строковые объекты |
- Джеймс трефил, 41001.36kb.
- Джеймс А. Дискретная математика и комбинаторика [Текст] / Джеймс А. Андерсон, 42.79kb.
- Человеческая способность эти ценности производить и использовать; является важнейшей, 110.76kb.
- Джеймс блиш города в полете 1-4 триумф времени вернись домой, землянин жизнь ради звезд, 10495.38kb.
- Джеймс Н. Фрей. Как написать гениальный роман, 2872.12kb.
- Дп «авто интернешнл» Київ, вул. Урицького, 1а Тел. (044) 20-60-333 Факс. (044) 20-60-343, 82.44kb.
- Тема Кол-во страниц, 26.85kb.
- Тема Кол-во страниц, 56.3kb.
- Тема Кол-во страниц, 20.7kb.
- Арнольд И. В. Стилистика современного английского языка, 20.42kb.
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.