CORE - 2 Flashcards
Что такое generics?
Дженерики - это механизм обобщений в Java, который позволяет создавать классы, интерфейсы и методы с параметризованными типами данных, обеспечивая безопасность типов и повышая переиспользование кода. Они позволяют создавать обобщенные (параметризованные) классы и методы, которые могут работать с различными типами данных без необходимости явного приведения типов.
Примером использования обобщенных типов может служить Java Collection Framework. Так, класс LinkedList<E> – типичный обобщенный тип. Он содержит параметр E, который представляет тип элементов, которые будут храниться в коллекции. Создание объектов
обобщенных типов происходит посредством замены параметризированных типов реальными типами данных. Вместо того, чтобы просто использовать LinkedList, ничего не говоря о типе элемента в списке, предлагается использовать точное указание типа
LinkedList<String>, LinkedList<Integer> и т. п.</Integer></String></E>
Что такое raw type (сырой тип)?
Сырой тип (raw type) в Java - это использование обобщенного класса или интерфейса без указания параметров типа.
List list = new ArrayList(); // raw type
List<Integer> listIntgrs = new ArrayList<>(); // parameterized type</Integer>
Что такое стирание типов?
Суть заключается в том, что внутри класса не хранится никакой информации о типе-параметре. Эта информация доступна только на этапе компиляции и стирается (становится недоступной) в runtime.
В чем заключается разница между IO и NIO?
Java IO (input-output) является потокоориентированным, а Java NIO (new/non-blocking io) – буфер-ориентированным. Потокоориентированный ввод/вывод подразумевает чтение/запись
из потока/в поток одного или нескольких байт в единицу времени поочередно. Данная информация нигде не кешируются. Таким образом, невозможно произвольно двигаться по потоку данных вперед или назад. В Java NIO данные сначала считываются в буфер, что дает
больше гибкости при обработке данных. Потоки ввода/вывода в Java IO являются блокирующими. Это значит, что когда в потоке
выполнения вызывается read() или write() метод любого класса из пакета java.io.*, происходит блокировка до тех пор, пока данные не будут считаны или записаны. Поток выполнения в данный момент не может делать ничего другого. Неблокирующий режим Java
NIO позволяет запрашивать считанные данные из канала (channel) и получать только то, что доступно на данный момент, или вообще ничего, если доступных данных пока нет. Вместо того, чтобы оставаться заблокированным, пока данные не станут доступными для считывания, поток выполнения может заняться чем-то другим. То же самое справедливо и для неблокирующего вывода. Поток выполнения может запросить запись в канал некоторых
данных, но не дожидаться при этом, пока они не будут полностью записаны.
В Java NIO имеются селекторы, которые позволяют одному потоку выполнения мониторить несколько каналов ввода. Т. е. существует возможность зарегистрировать несколько каналов с селектором, а потом использовать один поток выполнения для обслуживания каналов, имеющих доступные для обработки данные, или для выбора каналов, готовых для записи.
Какие классы поддерживают чтение и запись потоков в сжатом формате?
DeflaterOutputStream – компрессия данных в формате deflate;
* Deflater – компрессия данных в формат ZLIB;
* ZipOutputStream – потомок DeflaterOutputStream для компрессии данных в формате Zip;
* GZIPOutputStream – потомок DeflaterOutputStream для компрессии данных в формат GZIP;
* InflaterInputStream – декомпрессия данных в формате deflate;
* Inflater – декомпрессия данных в формате ZLIB;
* ZipInputStream – потомок InflaterInputStream для декомпрессии данных в формате Zip;
* GZIPInputStream – потомок InflaterInputStream для декомпрессии данных в формате
GZIP.
Что такое «каналы»?
Каналы (channels) – это логические (не физические) порталы, абстракции объектов более низкого уровня файловой системы (например, отображенные в памяти файлы и блокировки
файлов), через которые осуществляется ввод/вывод данных, а буферы являются источниками или приемниками этих переданных данных. При организации вывода данные, которые необходимо отправить, помещаются в буфер, который затем передается в канал.
При вводе данные из канала помещаются в заранее предоставленный буфер. Каналы напоминают трубопроводы, по которым эффективно транспортируются данные между буферами байтов и сущностями по ту сторону каналов. Каналы – это шлюзы, которые позволяют получить доступ к сервисам ввода/вывода операционной системы с
минимальными накладными расходами, а буферы – внутренние конечные точки этих шлюзов, используемые для передачи и приема данных.
Назовите основные классы потоков ввода/вывода?
Разделяют два вида потоков ввода/вывода:
* байтовые – java.io.InputStream, java.io.OutputStream;
* символьные – java.io.Reader, java.io.Writer.
В каких пакетах расположены классы потоков ввода/вывода?
java.io, java.nio. Для работы с потоками сжатых данных используются классы из пакета java.util.zip.
Какие подклассы класса InputStream вы знаете, для чего они предназначены?
InputStream – абстрактный класс, описывающий поток ввода;
* BufferedInputStream – буферизованный входной поток;
* ByteArrayInputStream позволяет использовать буфер в памяти (массив байтов) в качестве источника данных для входного потока;
* DataInputStream – входной поток для байтовых данных, включающий методы для чтения стандартных типов данных Java;
* FileInputStream – входной поток для чтения информации из файла;
* FilterInputStream – абстрактный класс, предоставляющий интерфейс для классов-надстроек, которые добавляют к существующим потокам полезные свойства;
* ObjectInputStream – входной поток для объектов;
* StringBufferInputStream превращает строку (String) во входной поток данных InputStream;
* PipedInputStream реализует понятие входного канала;
* PrintStream – выходной поток, включающий методы print() и println();
* PushbackInputStream – разновидность буферизации, обеспечивающая чтение байта с последующим его возвратом в поток, позволяет «заглянуть» во входной поток и увидеть, что оттуда поступит в следующий момент, не извлекая информации;
* SequenceInputStream используется для слияния двух или более потоков InputStream в единый.
Для чего используется PushbackInputStream?
Разновидность буферизации, обеспечивающая чтение байта с последующим его возвратом в поток. Класс PushbackInputStream позволяет «заглянуть» во входной поток и увидеть, что
оттуда поступит в следующий момент, не извлекая информации.
У класса есть дополнительный метод unread().
Для чего используется SequenceInputStream?
Класс SequenceInputStream позволяет сливать вместе несколько экземпляров класса InputStream. Конструктор принимает в качестве аргумента либо пару объектов класса InputStream, либо интерфейс Enumeration. Во время работы класс выполняет запросы на чтение из первого объекта класса InputStream и до конца, а затем переключается на второй. При использовании интерфейса работа продолжится по всем объектам класса InputStream. По достижении конца связанный с ним поток закрывается. Закрытие потока, созданного объектом класса SequenceInputStream, приводит к закрытию всех открытых потоков.
Какой класс позволяет читать данные из входного байтового потока в
формате примитивных типов данных?
Класс DataInputStream представляет поток ввода и предназначен для записи данных примитивных типов, таких, как int, double и т. д. Для каждого примитивного типа определен свой метод для считывания:
* boolean readBoolean(): считывает из потока булевое однобайтовое значение;
* byte readByte(): считывает из потока 1 байт;
* char readChar(): считывает из потока значение char;
* double readDouble(): считывает из потока 8-байтовое значение double;
* float readFloat(): считывает из потока 4-байтовое значение float;
* int readInt(): считывает из потока целочисленное значение int;
* long readLong(): считывает из потока значение long;
* short readShort(): считывает значение short;
* String readUTF(): считывает из потока строку в кодировке UTF-8.
Какие подклассы класса OutputStream вы знаете, для чего они
предназначены?
- OutputStream – это абстрактный класс, определяющий потоковый байтовый вывод;
- BufferedOutputStream – буферизированный выходной поток;
- ByteArrayOutputStream – все данные, посылаемые в этот поток, размещаются в
предварительно созданном буфере; - DataOutputStream – выходной поток байт, включающий методы для записи
стандартных типов данных Java; - FileOutputStream – запись данных в файл на физическом носителе;
- FilterOutputStream – абстрактный класс, предоставляющий интерфейс для классов-
надстроек, которые добавляют к существующим потокам полезные свойства; - ObjectOutputStream – выходной поток для записи объектов;
- PipedOutputStream реализует понятие выходного канала.
Какие подклассы класса Reader вы знаете, для чего они предназначены?
- Reader – абстрактный класс, описывающий символьный ввод;
- BufferedReader – буферизованный входной символьный поток;
- CharArrayReader – входной поток, который читает из символьного массива;
- FileReader – входной поток, читающий файл;
- FilterReader – абстрактный класс, предоставляющий интерфейс для классов-надстроек;
- InputStreamReader – входной поток, транслирующий байты в символы;
- LineNumberReader – входной поток, подсчитывающий строки;
- PipedReader – входной канал;
- PushbackReader – входной поток, позволяющий возвращать символы обратно в поток;
- StringReader – входной поток, читающий из строки.
Какие подклассы класса Writer вы знаете, для чего они предназначены?
- Writer – абстрактный класс, описывающий символьный вывод;
- BufferedWriter – буферизованный выходной символьный поток;
- CharArrayWriter – выходной поток, который пишет в символьный массив;
- FileWriter – выходной поток, пишущий в файл;
- FilterWriter – абстрактный класс, предоставляющий интерфейс для классов-надстроек;
- OutputStreamWriter – выходной поток, транслирующий байты в символы;
- PipedWriter – выходной канал;
- PrintWriter – выходной поток символов, включающий методы print() и println();
- StringWriter – выходной поток, пишущий в строку;