Смекни!
smekni.com

Общие представления о языке Java 5 (стр. 46 из 68)

Быстрое заполнение массива одинаковыми значениями может осуществляться методом Arrays.fill(массив, значение). Класс Arrays расположен в пакете java.util.

Поэлементное сравнение массива следует выполнять с помощью метода Arrays.equals(a,a1). Заметим, что у любого массива имеется метод equals, унаследованный от класса Object и позволяющий сравнивать массивы. Но, к сожалению, метод не переопределён, и сравнение идёт по адресам объектов, а не по содержимому. Поэтому a.equals(a1) это то же самое, что a==a1. Оба сравнения вернут false, так как адреса объектов, на которые ссылаются переменные a и a1, различаются. Напротив, сравнения a.equals(a3) и a==a3 вернут true, так как a и a3 ссылаются на один и тот же объект-массив.

Сортировка (упорядочение по значениям) массива a производится методами Arrays.sort(a) и Arrays.sort(a,index1,index2). Первый из них упорядочивает в порядке возрастания весь массив, второй – часть элементов (от индекса index1 до индекса index2). Имеются и более сложные методы сортировки. Элементы массива должны быть сравниваемы (поддерживать операцию сравнения).

Arrays.deepEquals(a1,a2) – сравнение на равенство содержимого массивов объектов a1 и a2 путём глубокого сравнения (на равенство содержимого, а не ссылок – на произвольном уровне вложенности).

Также в классе Arrays содержится большое число других полезных методов.

Коллекции, списки, итераторы

В Java получили широкое использование коллекции (Collections) – “умные” массивы с динамически изменяемой длиной, поддерживающие ряд важных дополнительных операций по сравнению с массивами. Базовым для иерархии коллекций является класс java.util.AbstractCollection. (В общем случае класс коллекции не обязан быть потомком AbstractCollection – он может является любым классом, реализующим интерфейс Collection).

Основные классы коллекций:

  • Set, SortedSet, HashSet,TreeSet – множества (наборы неповторяющихся элементов)
  • List, ArrayList,LinkedList,Vector – списки (упорядоченные наборы элементов, которые могут повторяться в разных местах списка)
  • Map, Sorted Map – таблицы (списки пар “имя”-“значение”)

Доступ к элементам коллекции в общем случае не может осуществляться по индексу, так как не все коллекции поддерживают индексацию элементов. Эту функцию осуществляют с помощью специального объекта – итератора (iterator). У каждой коллекции collection имеется свой итератор который умеет с ней работать, поэтому итератор вводят следующим образом:

Iterator iter = collection.iterator()

У итераторов имеются следующие три метода:

boolean hasNext()- даёт информацию, имеется ли в коллекции следующий объект.

Object next() – возвращает ссылку на следующий объект коллекции.

void remove() – удаляет из коллекции текущий объект, то есть тот, ссылка на который была получена последним вызовом next().

Пример преобразования массива в коллекцию и цикл с доступом к элементам этой коллекции, осуществляемый с помощью итератора:

java.util.List components= java.util.Arrays.asList(this.getComponents());

for (Iterator iter = components.iterator();iter.hasNext();) {

Object elem = (Object) iter.next();

javax.swing.JOptionPane.showMessageDialog(null,"Компонент: "+

elem.toString());

}

Основные методы коллекций:

Имя метода Действие
boolean add(Object obj) Добавление объекта в коллекцию (в конец списка). Возвращает true в случае успешного добавления - изменения коллекции. Коллекция может не позволить добавление элементов несовместимого типа или не подходящих по какому-либо другому признаку.
boolean addAll(Collection c) Добавление в коллекцию всех объектов из другой коллекции. Возвращает true в случае успешного добавления, то есть если добавлен хотя бы один элемент.
void clear() Очистка коллекции - удаление из неё ссылок на все входящие в коллекцию объекты. При этом те объекты, на которые имеются ссылки у других элементов программы, не удаляются из памяти.
boolean contains(Object obj) Возвращает true в случае, если коллекция содержит объект obj. Проверка осуществляется с помощью поочерёдного вызова метода obj.equals(e) для элементов e, входящих в коллекцию.
boolean containsAll(Collection c) Возвращает true в случае, если коллекция содержит все элементы коллекции c.
boolean isEmpty() Возвращает true в случае, если коллекция пуста, то есть не содержит ни одного элемента.
Iterator iterator() Возвращает ссылку на итератор – объект, позволяющий получать поочерёдный доступ к элементам коллекции. Для одной коллекции разрешается иметь произвольное число объектов-итераторов, в том числе – разных типов. В процессе работы они могут указывать на разные элементы коллекции. После создания итератор всегда указывает на начало коллекции – вызов его метода next() даёт ссылку на начальный элемент коллекции.
boolean remove(Object obj) Удаляет из коллекции первое встретившееся вхождение объекта obj. Поиск и удаление осуществляется с помощью итератора. Возвращает true в случае, если удаление удалось, то есть если коллекция изменилась.
boolean remove All(Collection c) Удаляет из коллекции все элементы коллекции c. Возвращает true в случае, если удаление удалось, то есть если коллекция изменилась.
boolean retainAll(Collection c) Оставляет в коллекции только те из входящих в неё элементов, которые входят в коллекцию c.
int size() Возвращает число элементов в коллекции.
Object[] toArray() Возвращает массив ссылок на объекты, содержащиеся в коллекции. То есть преобразует коллекцию в массив.
T[] toArray(T[n] a) Возвращает массив элементов типа T, полученных в результате преобразования элементов, содержащихся в коллекции. То есть преобразует коллекцию в массив. Если число элементов коллекции не превышает размер n массива a, размещение данных производится в существующих ячейках памяти, отведённых под массив. Если превышает n – в памяти динамически создаётся и заполняется новый набор ячеек, и их число делается равным числу элементов коллекции. После чего переменная a начинает ссылаться на новый набор ячеек.
String toString() Метод переопределён – он возвращает строку со списком элементов коллекции. В списке выводятся заключённые в квадратные скобки строковые представления элементов, разделяемые комбинацией “, ” – запятая с пробелом после неё.

Самыми распространёнными вариантами коллекций являются списки (Lists). Они во многом похожи на массивы, но отличаются от массивов тем, что в списках основными операциями являются добавление и удаление элементов. А не доступ к элементам по индексу, как в массивах.

В классе List имеются методы коллекции, а также ряд дополнительных методов:

list.get(i) – получение ссылки на элемент списка list по индексу i.

list.indexOf(obj) - получение индекса элемента obj в списке list. Возвращает -1 если объект не найден.

list.listIterator(i) – получение ссылки на итератор типа ListIterator, обладающего дополнительными методами по сравнению с итераторами типа Iterator.

list.listIterator(i) – то же с позиционированием итератора на элемент с индексом i.

list.remove(i) – удаление из списка элемента с индексом i.

list.set(i,obj) – замена в списке элемента с индексом i на объект obj.

list.subList(i1,i2) – возвращает ссылку на подсписок, состоящий из элементов списка с индексами от i1 до i2.

Кроме них в классе List имеются и многие другие полезные методы.

Ряд полезных методов для работы с коллекциями содержится в классе Collections:

Collections.addAll(c,e1,e2,…,eN) - добавление в коллекцию c произвольного числа элементов e1,e2,…,eN.

Collections.frequency(c,obj) – возвращает число вхождений элемента obj в коллекцию c.

Collections.reverse(list) – обращает порядок следования элементов в списке list (первые становятся последними и наоборот).

Collections.sort(list) – сортирует список в порядке возрастания элементов. Сравнение идёт вызовом метода e1.compareTo(e2) для очередных элементов списка e1 и e2.

Кроме них в классе Collections имеются и многие другие полезные методы.

В классе Arrays имеется метод

Arrays.asList(a) – возвращает ссылку на список элементов типа T, являющийся оболочкой над массивом T[] a. При этом и массив, и список содержат одни и те же элементы, и изменение элемента списка приводит к изменению элемента массива, и наоборот.

Работа со строками в Java. Строки как объекты. Классы String, StringBuffer и StringBuilder

Класс String инкапсулирует действия со строками. Объект типа String – строка, состоящая из произвольного числа символов, от 0 до 2*109. Литерные константы типа String представляют собой последовательности символов, заключённые в двойные кавычки:

”A”, ”abcd”, ”abcd”, ”Мама моет раму”, ” ”.

Это так называемые “длинные” строки. Внутри литерной строковой константы не разрешается использовать ряд символов - вместо них применяются управляющие последовательности.

Внутри строки разрешается использовать переносы на новую строку. Но литерные константы с такими переносами запрещены, и надо ставить управляющую последовательность “\n”. К сожалению, такой перенос строки не срабатывает в компонентах.

Разрешены пустые строки, не содержащие ни одного символа.

В языке Java строковый и символьный тип несовместимы. Поэтому ”A” – строка из одного символа, а 'A' – число с ASCII кодом символа ”A”. Это заметно усложняет работу со строками и символами.

Строки можно складывать: если s1 и s2 строковые литерные константы или переменные, то результатом операции s1+s2 будет строка, являющаяся сцеплением (конкатенацией) строк, хранящихся в s1 и s2. Например, в результате операции

String s=”Это ”+”моя строка”;

в переменной s будет храниться строковое значение ”Это моя строка”.

Для строк разрешён оператор ”+=”. Для строковых операндов s1 и s2 выражение

s1+=s2 эквивалентно выражению s1=s1+s2.

Любая строка (набор символов) является объектом – экземпляром класса String. Переменные типа String являются ссылками на объекты, что следует учитывать при передаче параметров строкового типа в подпрограммы, а также при многократных изменениях строк. При каждом изменении строки в динамической области памяти создаётся новый объект, а прежний превращается в “мусор”. Поэтому при многократных изменениях строк в цикле возникает много мусора, что нежелательно.