Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы к коллоквиуму.docx
Скачиваний:
2
Добавлен:
17.11.2018
Размер:
49.95 Кб
Скачать

IndexOfSubList/lastIndexOfSubList – производит поиск “подсписка”.

swap(List, int, int) – меняет местами два элемента в списке по их индексам.

frequency(Collection, Object) – считает количество переданных элементов в коллекции, сравнивает через equals.

disjoint(Collection, Collection) – проверяет пересекаются ли коллекции, то есть, не содержат ли они одинаковых элементов.

addAll(Collection<T>, T...) – добавляет в коллекцию массив.

nCopies – возвращает неизменяемый список состоящий из указанного числа указанных элементов. На самом деле коллекция содержит только один элемент и эмулирует состояние, будто их несколько.

singletonInterface – возвращает коллекцию из одного элемента или карту из одной пары ключ-значение.

Arrays.asList позволяет работать с массивом, как со списком фиксированной длины.

asLifoQueue позволяет создать из дека очередь типа LI-FO.

enumeration позволяет обращаться к коллекции как к перечислению (для поддержки старого кода).

checkedInterface – возвращает коллекцию или карту динамически проверяющую то, что в неё будут добавляеться только элементы указаного типа, в противном случае будет получено ClassCastException. Метод необходим, так как механизм Generic’ов можно обойти с помощью непроверенного преобразования (unchecked cast).

synchronizedInterface – весь доступ к карте или коллекции будет синхронизирован.

unmodifiableInterface – коллекцию или карту нельзя будет изменять, все изменяющие её методы будут выдавать UnsupportedOperationException. Многие методы возвращающие коллекцию, возвращают её немодифицируемой без предупреждения.

Указанные выше методы делают коллекцию сериализуемой в том случае, если переданная коллекция была сериализуема.

emptyInterface – возвращает пустую, неизменяемую коллекцию, карту, перечисление или итератор.

newSetFromMap создает множество с полностью аналогичными характеристиками карте.

Некоторые алгоритмы заключены в самих коллекциях, например, методы addAll, removeAll, containsAll, first, last, subSet и т. д.

Вторая часть

  1. Сериализация объектов.

Сериализация – преобразование объекта или структуры в поток битов. Обратный процесс называют десериализацией.

Java имеет встроенный механизм сериализации. Класс, реализующий интерфейс Serializable является сериализуемым. После этого класс может быть записан в ObjectOutputStream с помощью метода writeObject. Если в процессе записи потребуется сериализовать несериализуемый объект, метод выбросит NotSerializableException.

В процессе сериализации, сериализуются все не статические поля объекта, которые не объявлены с модификатором transient. Для внутренних классов неявный указатель на внешний класс также требует сериализации, он не может являться transient. Все примитивные типы записываются в поток без вопросов. Для всех объектов, опять же, вызывается процедура сериализации.

Объекты могут быть считаны с помощью метода readObject класса ObjectInputStream. Если класс считываемого объекта ещё не был загружен java-машиной, будет произведен поиск, и в случае удачи, класс будет загружен. В противном случае, будет получен ClassNotFoundException. В случае успеха вернется Object – десереализованный объект.

В классах, реализующих Serializable, рекомендуется объявить поле с сигнутурой:

static final long serialVersionUID = ...L (с любым модификатором доступа)

Если в классе не объявлено это поле, он будет вычислено во время сериализации. Так как различные реализации могут вычислить это значение немного по-разному, может произойти неожиданное InvalidClassException. Поле используется для того чтобы, при десериализаци, установить действительно ли десериализуется объект класса загруженного java-машиной. Единственные классы, в которых поле нельзя объявить явно – массивы, для которых таких проблем не возникнет гарантировано.

Методы со следующей сигнутурой (модификатор доступа любой, соответственно и распространяется на подклассы в зависимости от модификатора):

Object writeReplace() throws ObjectStreamException

Object readResolve() throws ObjectStreamException

Используются для подмены объекта перед записью или после считывания. Они будут вызваны в том случае, если они объявлены.

Если, по каким-то причинам, требуется заменить процедуру сериализации класса, но при этом не изменять сериализацию сериализуемых классов-родителей, в классе можно объявить методы:

private void writeObject(java.io.ObjectOutputStream out) throws IOException

private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException

private void readObjectNoData() throws ObjectStreamException

Методы writeObject и readObject будут вызваны (если они имеются) и соответственно, запишут и считают объект. out.defaultWriteObject и in.defaultReadObject вызывают стандартную процедуру сериализации и могут быть вызваны только из этого метода. readObjectNoData будет вызван в том случае если версии классов на принимающей и передающей стороне отличаются или поток был поврежден. При этом сериализуемые классы-родители могли быть восстановлены нормально.

Также, существует интерфейс Externalizable, его методы readExternal и writeExternal позволяют также переопределить операцию сериализации, но при этом подменяется операция сериализации для данного класса и также всех классов родителей, причем если класс и/или его родитель содержит операции writeObject и readObject, то они будут проигнорированы. Возможность вызвать стандартную процедуру сериализации класса отсутствует. Если класс реализует Externalizable, то у него должен быть явно определен публичный конструктор без параметров, иначе процедура сериализации не будет выполнена и будет выброшен InvalidClassException.

Если сериализуемый класс наследуется от несериализуемого, то у родителя должен быть определен видимый конструктор по умолчанию (иначе будет InvalidClassException), который и будет вызван при сериализации. Поля этого класса уже не будут сериализованы.