- •Первая часть
- •Интерфейсы и классы коллекций.
- •Интерфейсы:
- •Классы:
- •Итераторы:
- •Компараторы:
- •Интерфейсы и классы карт.
- •Интерфейсы:
- •Классы:
- •IndexOfSubList/lastIndexOfSubList – производит поиск “подсписка”.
- •Вторая часть
- •Сериализация объектов.
- •Байтовые потоки.
- •Символьные потоки.
- •Объектные потоки.
- •Третья часть
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 и т. д.
Вторая часть
-
Сериализация объектов.
Сериализация – преобразование объекта или структуры в поток битов. Обратный процесс называют десериализацией.
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), который и будет вызван при сериализации. Поля этого класса уже не будут сериализованы.