Быстрое заполнение массива одинаковыми значениями может осуществляться методом 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).
Основные классы коллекций:
Доступ к элементам коллекции в общем случае не может осуществляться по индексу, так как не все коллекции поддерживают индексацию элементов. Эту функцию осуществляют с помощью специального объекта – итератора (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 являются ссылками на объекты, что следует учитывать при передаче параметров строкового типа в подпрограммы, а также при многократных изменениях строк. При каждом изменении строки в динамической области памяти создаётся новый объект, а прежний превращается в “мусор”. Поэтому при многократных изменениях строк в цикле возникает много мусора, что нежелательно.