CORE - 2 Flashcards

1
Q

Что такое generics?

A

Дженерики - это механизм обобщений в Java, который позволяет создавать классы, интерфейсы и методы с параметризованными типами данных, обеспечивая безопасность типов и повышая переиспользование кода. Они позволяют создавать обобщенные (параметризованные) классы и методы, которые могут работать с различными типами данных без необходимости явного приведения типов.
Примером использования обобщенных типов может служить Java Collection Framework. Так, класс LinkedList<E> – типичный обобщенный тип. Он содержит параметр E, который представляет тип элементов, которые будут храниться в коллекции. Создание объектов
обобщенных типов происходит посредством замены параметризированных типов реальными типами данных. Вместо того, чтобы просто использовать LinkedList, ничего не говоря о типе элемента в списке, предлагается использовать точное указание типа
LinkedList<String>, LinkedList<Integer> и т. п.</Integer></String></E>

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Что такое raw type (сырой тип)?

A

Сырой тип (raw type) в Java - это использование обобщенного класса или интерфейса без указания параметров типа.
List list = new ArrayList(); // raw type
List<Integer> listIntgrs = new ArrayList<>(); // parameterized type</Integer>

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Что такое стирание типов?

A

Суть заключается в том, что внутри класса не хранится никакой информации о типе-параметре. Эта информация доступна только на этапе компиляции и стирается (становится недоступной) в runtime.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

В чем заключается разница между IO и NIO?

A

Java IO (input-output) является потокоориентированным, а Java NIO (new/non-blocking io) – буфер-ориентированным. Потокоориентированный ввод/вывод подразумевает чтение/запись
из потока/в поток одного или нескольких байт в единицу времени поочередно. Данная информация нигде не кешируются. Таким образом, невозможно произвольно двигаться по потоку данных вперед или назад. В Java NIO данные сначала считываются в буфер, что дает
больше гибкости при обработке данных. Потоки ввода/вывода в Java IO являются блокирующими. Это значит, что когда в потоке
выполнения вызывается read() или write() метод любого класса из пакета java.io.*, происходит блокировка до тех пор, пока данные не будут считаны или записаны. Поток выполнения в данный момент не может делать ничего другого. Неблокирующий режим Java
NIO позволяет запрашивать считанные данные из канала (channel) и получать только то, что доступно на данный момент, или вообще ничего, если доступных данных пока нет. Вместо того, чтобы оставаться заблокированным, пока данные не станут доступными для считывания, поток выполнения может заняться чем-то другим. То же самое справедливо и для неблокирующего вывода. Поток выполнения может запросить запись в канал некоторых
данных, но не дожидаться при этом, пока они не будут полностью записаны.
В Java NIO имеются селекторы, которые позволяют одному потоку выполнения мониторить несколько каналов ввода. Т. е. существует возможность зарегистрировать несколько каналов с селектором, а потом использовать один поток выполнения для обслуживания каналов, имеющих доступные для обработки данные, или для выбора каналов, готовых для записи.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Какие классы поддерживают чтение и запись потоков в сжатом формате?

A

DeflaterOutputStream – компрессия данных в формате deflate;
* Deflater – компрессия данных в формат ZLIB;
* ZipOutputStream – потомок DeflaterOutputStream для компрессии данных в формате Zip;
* GZIPOutputStream – потомок DeflaterOutputStream для компрессии данных в формат GZIP;
* InflaterInputStream – декомпрессия данных в формате deflate;
* Inflater – декомпрессия данных в формате ZLIB;
* ZipInputStream – потомок InflaterInputStream для декомпрессии данных в формате Zip;
* GZIPInputStream – потомок InflaterInputStream для декомпрессии данных в формате
GZIP.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Что такое «каналы»?

A

Каналы (channels) – это логические (не физические) порталы, абстракции объектов более низкого уровня файловой системы (например, отображенные в памяти файлы и блокировки
файлов), через которые осуществляется ввод/вывод данных, а буферы являются источниками или приемниками этих переданных данных. При организации вывода данные, которые необходимо отправить, помещаются в буфер, который затем передается в канал.
При вводе данные из канала помещаются в заранее предоставленный буфер. Каналы напоминают трубопроводы, по которым эффективно транспортируются данные между буферами байтов и сущностями по ту сторону каналов. Каналы – это шлюзы, которые позволяют получить доступ к сервисам ввода/вывода операционной системы с
минимальными накладными расходами, а буферы – внутренние конечные точки этих шлюзов, используемые для передачи и приема данных.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Назовите основные классы потоков ввода/вывода?

A

Разделяют два вида потоков ввода/вывода:
* байтовые – java.io.InputStream, java.io.OutputStream;
* символьные – java.io.Reader, java.io.Writer.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

В каких пакетах расположены классы потоков ввода/вывода?

A

java.io, java.nio. Для работы с потоками сжатых данных используются классы из пакета java.util.zip.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Какие подклассы класса InputStream вы знаете, для чего они предназначены?

A

InputStream – абстрактный класс, описывающий поток ввода;
* BufferedInputStream – буферизованный входной поток;
* ByteArrayInputStream позволяет использовать буфер в памяти (массив байтов) в качестве источника данных для входного потока;
* DataInputStream – входной поток для байтовых данных, включающий методы для чтения стандартных типов данных Java;
* FileInputStream – входной поток для чтения информации из файла;
* FilterInputStream – абстрактный класс, предоставляющий интерфейс для классов-надстроек, которые добавляют к существующим потокам полезные свойства;
* ObjectInputStream – входной поток для объектов;
* StringBufferInputStream превращает строку (String) во входной поток данных InputStream;
* PipedInputStream реализует понятие входного канала;
* PrintStream – выходной поток, включающий методы print() и println();
* PushbackInputStream – разновидность буферизации, обеспечивающая чтение байта с последующим его возвратом в поток, позволяет «заглянуть» во входной поток и увидеть, что оттуда поступит в следующий момент, не извлекая информации;
* SequenceInputStream используется для слияния двух или более потоков InputStream в единый.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Для чего используется PushbackInputStream?

A

Разновидность буферизации, обеспечивающая чтение байта с последующим его возвратом в поток. Класс PushbackInputStream позволяет «заглянуть» во входной поток и увидеть, что
оттуда поступит в следующий момент, не извлекая информации.
У класса есть дополнительный метод unread().

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Для чего используется SequenceInputStream?

A

Класс SequenceInputStream позволяет сливать вместе несколько экземпляров класса InputStream. Конструктор принимает в качестве аргумента либо пару объектов класса InputStream, либо интерфейс Enumeration. Во время работы класс выполняет запросы на чтение из первого объекта класса InputStream и до конца, а затем переключается на второй. При использовании интерфейса работа продолжится по всем объектам класса InputStream. По достижении конца связанный с ним поток закрывается. Закрытие потока, созданного объектом класса SequenceInputStream, приводит к закрытию всех открытых потоков.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Какой класс позволяет читать данные из входного байтового потока в
формате примитивных типов данных?

A

Класс 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.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Какие подклассы класса OutputStream вы знаете, для чего они
предназначены?

A
  • OutputStream – это абстрактный класс, определяющий потоковый байтовый вывод;
  • BufferedOutputStream – буферизированный выходной поток;
  • ByteArrayOutputStream – все данные, посылаемые в этот поток, размещаются в
    предварительно созданном буфере;
  • DataOutputStream – выходной поток байт, включающий методы для записи
    стандартных типов данных Java;
  • FileOutputStream – запись данных в файл на физическом носителе;
  • FilterOutputStream – абстрактный класс, предоставляющий интерфейс для классов-
    надстроек, которые добавляют к существующим потокам полезные свойства;
  • ObjectOutputStream – выходной поток для записи объектов;
  • PipedOutputStream реализует понятие выходного канала.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Какие подклассы класса Reader вы знаете, для чего они предназначены?

A
  • Reader – абстрактный класс, описывающий символьный ввод;
  • BufferedReader – буферизованный входной символьный поток;
  • CharArrayReader – входной поток, который читает из символьного массива;
  • FileReader – входной поток, читающий файл;
  • FilterReader – абстрактный класс, предоставляющий интерфейс для классов-надстроек;
  • InputStreamReader – входной поток, транслирующий байты в символы;
  • LineNumberReader – входной поток, подсчитывающий строки;
  • PipedReader – входной канал;
  • PushbackReader – входной поток, позволяющий возвращать символы обратно в поток;
  • StringReader – входной поток, читающий из строки.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Какие подклассы класса Writer вы знаете, для чего они предназначены?

A
  • Writer – абстрактный класс, описывающий символьный вывод;
  • BufferedWriter – буферизованный выходной символьный поток;
  • CharArrayWriter – выходной поток, который пишет в символьный массив;
  • FileWriter – выходной поток, пишущий в файл;
  • FilterWriter – абстрактный класс, предоставляющий интерфейс для классов-надстроек;
  • OutputStreamWriter – выходной поток, транслирующий байты в символы;
  • PipedWriter – выходной канал;
  • PrintWriter – выходной поток символов, включающий методы print() и println();
  • StringWriter – выходной поток, пишущий в строку;
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

В чем отличие класса PrintWriter от PrintStream?

A

В классе PrintWriter применен усовершенствованный способ работы с символами Unicode и другой механизм буферизации вывода. В классе PrintStream буфер вывода сбрасывался всякий раз, когда вызывался метод print() или println(), а при использовании класса PrintWriter
существует возможность отказаться от автоматического сброса буферов, выполняя его явным образом при помощи метода flush().
Кроме того, методы класса PrintWriter никогда не создают исключений. Для проверки ошибок необходимо явно вызвать метод checkError().

17
Q

Чем отличаются и что общего у InputStream, OutputStream, Reader, Writer?

A
  • InputStream и его наследники – совокупность для получения байтовых данных из различных источников;
  • OutputStream и его наследники – набор классов определяющих потоковый байтовый вывод;
  • Reader и его наследники определяют потоковый ввод символов Unicode;
  • Writer и его наследники определяют потоковый вывод символов Unicode.
18
Q

Какие классы позволяют преобразовать байтовые потоки в символьные и обратно?

A
  • OutputStreamWriter – «мост» между классом OutputStream и классом Writer, символы, записанные в поток, преобразовываются в байты;
  • InputStreamReader – аналог для чтения, при помощи методов класса Reader читаются байты из потока InputStream и далее преобразуются в символы.
19
Q

Какие классы позволяют ускорить чтение/запись за счет использования буфера?

A
  • BufferedInputStream(InputStream in)/BufferedInputStream(InputStream in, int size);
  • BufferedOutputStream(OutputStream out)/BufferedOutputStream(OutputStream out, int
    size);
  • BufferedReader(Reader r)/BufferedReader(Reader in, int sz);
  • BufferedWriter(Writer out)/BufferedWriter(Writer out, int sz).
20
Q

Существует ли возможность перенаправить потоки стандартного ввода/вывода?

A

Класс System позволяет вам перенаправлять стандартный ввод, вывод и поток вывода ошибок, используя простой вызов статического метода:
* setIn(InputStream) – для ввода;
* setOut(PrintStream) – для вывода;
* setErr(PrintStream) – для вывода ошибок.

21
Q

Какой класс предназначен для работы с элементами файловой системы?

A

File работает непосредственно с файлами и каталогами. Данный класс позволяет создавать новые элементы и получать информацию существующих: размер, права доступа, время и дату создания, путь к родительскому каталогу.

22
Q

Какие методы класса File вы знаете?

A

Наиболее используемые методы класса File:
* boolean createNewFile(): делает попытку создать новый файл;
* boolean delete(): делает попытку удалить каталог или файл;
* boolean mkdir(): делает попытку создать новый каталог;
* boolean renameTo(File dest): делает попытку переименовать файл или каталог;
* boolean exists(): проверяет, существует ли файл или каталог;
* String getAbsolutePath(): возвращает абсолютный путь для пути, переданного в конструктор объекта;
* String getName(): возвращает краткое имя файла или каталога;
* String getParent(): возвращает имя родительского каталога;
* boolean isDirectory(): возвращает значение true, если по указанному пути располагается каталог;
* boolean isFile(): возвращает значение true, если по указанному пути находится файл;
* boolean isHidden(): возвращает значение true, если каталог или файл являются скрытыми;
* long length(): возвращает размер файла в байтах;
* long lastModified(): возвращает время последнего изменения файла или каталога;
* String[] list(): возвращает массив файлов и подкаталогов, которые находятся в определенном каталоге;
* File[] listFiles(): возвращает массив файлов и подкаталогов, которые находятся в определенном каталоге.

23
Q

Что вы знаете об интерфейсе FileFilter?

A

Интерфейс FileFilter применяется для проверки, попадает ли объект File под некоторое условие. Этот интерфейс содержит единственный метод boolean accept(File pathName). Этот метод необходимо переопределить и реализовать. Например:
public boolean accept(final File file) {
return file.isExists() && file.isDirectory();
}

24
Q

Как выбрать все элементы определенного каталога по критерию
(например, с определенным расширением)?

A

Метод File.listFiles() возвращает массив объектов File, содержащихся в каталоге. Метод может принимать в качестве параметра объект класса, реализующего FileFilter. Это позволяет включить в список только те элементы, для которых метод accept возвращает true (критерием может быть длина имени файла или его расширение).

25
Q

Что вы знаете о RandomAccessFile?

A

Класс java.io.RandomAccessFile обеспечивает чтение и запись данных в произвольном месте файла. Он не является частью иерархии InputStream или OutputStream. Это полностью отдельный класс, имеющий собственные (в большинстве своем native) методы.
Объяснением этого может быть то, что RandomAccessFile имеет во многом отличающееся поведение по сравнению с остальными классами ввода/вывода, так как позволяет в пределах файла перемещаться вперед и назад.
RandomAccessFile имеет такие специфические методы как:
* getFilePointer() для определения текущего местоположения в файле;
* seek() для перемещения на новую позицию в файле;
* length() для выяснения размера файла;
* setLength() для установки размера файла;
* skipBytes() для того, чтобы попытаться пропустить определенное число байт;
* getChannel() для работы с уникальным файловым каналом, ассоциированным с заданным файлом;
* методы для выполнения обычного и форматированного вывода из файла (read(), readInt(), readLine(), readUTF() и т.п .);
* методы для обычной или форматированной записи в файл с прямым доступом (write(), writeBoolean(), writeByte() и т. п.).
Следует отметить, что конструкторы RandomAccessFile требуют второй аргумент, указывающий необходимый режим доступа к файлу – только чтение (“r”), чтение и запись (“rw”) или иную их разновидность.

26
Q

Какие режимы доступа к файлу есть у RandomAccessFile?

A

«r» открывает файл только для чтения. Запуск любых методов записи данных приведет к выбросу исключения IOException.
«rw» открывает файл для чтения и записи. Если файл еще не создан, то осуществляется попытка создать его.
«rws» открывает файл для чтения и записи подобно «rw», но требует от системы при каждом изменении содержимого файла или метаданных синхронно записывать эти изменения на физический носитель.
«rwd» открывает файл для чтения и записи подобно «rws», но требует от системы синхронно записывать изменения на физический носитель только при каждом изменении содержимого файла. Если изменяются метаданные, синхронная запись не требуется.

27
Q

Какой символ является разделителем при указании пути в файловой системе?

A

Для различных операционных систем символ разделителя различается. Для Windows это \, для Linux – /.
В Java получить разделитель для текущей операционной системы можно через обращение к статическому полю File.separator.

28
Q

Что такое «абсолютный путь» и «относительный путь»?

A

Абсолютный (полный) путь – это путь, который указывает на одно и то же место в файловой системе вне зависимости от текущей рабочей директории или других обстоятельств. Полный путь всегда начинается с корневого каталога.
Относительный путь представляет собой путь по отношению к текущему рабочему каталогу пользователя или активного приложения.

29
Q

Что такое «символьная ссылка»?

A

Символьная (символическая) ссылка (также «симлинк», Symbolic link) – специальный файл в файловой системе, в котором вместо пользовательских данных содержится путь к файлу, который должен быть открыт при попытке обратиться к данной ссылке (файлу). Целью
ссылки может быть любой объект: например, другая ссылка, файл, каталог или даже несуществующий файл (в последнем случае при попытке открыть его должно выдаваться сообщение об отсутствии файла).
Символьные ссылки используются для более удобной организации структуры файлов на компьютере, так как:
* позволяют для одного файла или каталога иметь несколько имен и различных атрибутов;
* свободны от некоторых ограничений, присущих жестким ссылкам (последние действуют только в пределах одной файловой системы (одного раздела) и не могут ссылаться на каталоги).

30
Q

Что такое default-методы интерфейса?

A

Java 8 позволяет добавлять неабстрактные реализации методов в интерфейс, используя ключевое слово default:
interface Example {
int process(int a);
default void show() {
System.out.println(“default show()”);
}
}
Если класс реализует интерфейс, он может, но не обязан, реализовать методы по умолчанию, уже реализованные в интерфейсе. Класс наследует реализацию по умолчанию. Если некий класс реализует несколько интерфейсов, которые имеют одинаковый метод по
умолчанию, то класс должен реализовать метод с совпадающей сигнатурой самостоятельно.

Ситуация аналогична, если один интерфейс имеет метод по умолчанию, а в другом этот же метод является абстрактным – никакой реализации по умолчанию классом не наследуется. Метод по умолчанию не может переопределить метод класса java.lang.Object.
Помогают реализовывать интерфейсы без страха нарушить работу других классов. Позволяют избежать создания служебных классов, так как все необходимые методы могут быть представлены в самих интерфейсах.Дают свободу классам выбрать метод, который нужно переопределить. Одной из основных причин внедрения методов по умолчанию является возможность коллекций в Java 8 использовать лямбда-выражения.

31
Q

Как вызывать default-метод интерфейса в реализующем этот интерфейс классе?

A

Используя ключевое слово super вместе с именем интерфейса:
ИмяИнтерфейса.super.метод();

32
Q

Что такое static-метод интерфейса?

A

Статические методы интерфейса похожи на методы по умолчанию, за исключением того, что для них отсутствует возможность переопределения в классах, реализующих интерфейс.
Статические методы в интерфейсе являются частью интерфейса без возможности использовать их для объектов класса реализации.
Методы класса java.lang.Object нельзя переопределить как статические.
Статические методы в интерфейсе используются для обеспечения вспомогательных методов, например, проверки на null, сортировки коллекций и т. д.

33
Q

Как вызывать static метод интерфейса?

A

Используя имя интерфейса:
Paper.show();

34
Q

Что такое «лямбда»? Какова структура и особенности использования
лямбда-выражения?

A

Лямбда представляет собой набор инструкций, которые можно выделить в отдельную переменную и затем многократно вызвать в различных местах программы. Основу лямбда-выражения составляет лямбда-оператор, который представляет стрелку ->.
Этот оператор разделяет лямбда-выражение на две части: левая часть содержит список параметров выражения, а правая представляет тело лямбда-выражения, где выполняются все действия.
Лямбда-выражение не выполняется само по себе, а образует реализацию метода, определенного в функциональном интерфейсе. При этом важно, что функциональный интерфейс должен содержать только один единственный метод без реализации.
По факту лямбда-выражения являются в некотором роде сокращенной формой внутренних анонимных классов, которые ранее применялись в Java.

Отложенное выполнение (deferred execution) лямбда-выражения определяется один раз в одном месте программы, вызываются при необходимости любое количество раз и в произвольном месте программы. Параметры лямбда-выражения должны соответствовать по типу параметрам метода функционального интерфейса:
operation = (int x, int y) -> x + y;
//При написании самого лямбда-выражения тип параметров разрешается не указывать:
(x, y) -> x + y;
//Если метод не принимает никаких параметров, то пишутся пустые скобки, например:
() -> 30 + 20;
//Если метод принимает только один параметр, то скобки можно опустить:
n -> n * n;
Конечные лямбда-выражения не обязаны возвращать какое-либо значение. Блочные лямбда-выражения обрамляются фигурными скобками. В блочных лямбда-выражениях можно использовать внутренние вложенные блоки, циклы, конструкции if, switch,
создавать переменные и т. д. Если блочное лямбда-выражение должно возвращать значение, то явным образом применяется оператор return:
Operationable operation = (int x, int y) -> {
if (y == 0) {
return 0;
}
else {
return x / y;
}
}
Передача лямбда-выражения в качестве параметра метода:
interface Condition {
boolean isAppropriate(int n);
}
private static int sum(int[] numbers, Condition condition) {
int result = 0;
for (int i : numbers) {
if (condition.isAppropriate(i)) {
result += i;
}
}
return result;
}
public static void main(String[] args) {
System.out.println(sum(new int[] {0, 1, 0, 3, 0, 5, 0, 7, 0, 9}, (n) -> n != 0));
}