Коллекции. Потоки Байтовые потоки InputStream и OutputStream. Символьные потоки Reader и Writer
Скачать 32.99 Kb.
|
2. Что такое System.in, что такое System.out. System.in — это "стандартный" поток ввода и объект InputStream. Этот поток уже открыт и готов к подаче входных данных. Обычно этот поток соответствует вводу с клавиатуры или другому источнику ввода, заданному окружением хоста или пользователем. System.out — это "стандартный" поток вывода и объект PrintStream. Этот поток уже открыт и готов к приему выходных данных. Обычно этот поток соответствует выводу на дисплей или другому месту вывода, указанному окружением хоста или пользователем. 3. Какие интерфейсы реализует InputStream/ OutputStream/ Reader/ Writer. InputStream реализует интерфейсы: Closeable и AutoCloseable OutputStream реализует интерфейсы: Closeable, Flushable, AutoCloseable Reader реализует интерфейсы: Closeable, AutoCloseable, Readable Writer реализует интерфейсы: Closeable, Flushable, Appendable, AutoCloseable 4. Что такое паттерн адаптер. Паттерн проектирования адаптер — это такой шаблон проектирования, который позволяет обернуть несовместимые объекты в адаптер, чтобы сделать их совместимыми друг с другом. 5. Пример адаптера и декоратора из IO. Декоратор имеет альтернативное название — обёртка. Оно более точно описывает суть паттерна: вы помещаете целевой объект в другой объект-обёртку, который запускает базовое поведение объекта, а затем добавляет к результату что-то своё. *Адаптер меняет интерфейс существующего объекта. *Декоратор улучшает другой объект без изменения его интерфейса. Причём Декоратор поддерживает рекурсивную вложенность, чего не скажешь об Адаптере. Адаптер предоставляет классу альтернативный интерфейс, а Декоратор предоставляет расширенный интерфейс. 6. Разница между mkdir и mkdirs В классе File имеются еще два полезных служебных метода: mkdir () и mkdirs (). В частности, метод mkdir () создает каталог, возвращая логическое значение true при удачном исходе операции и логическое значение false при неудачном ее исходе. Операция создания каталога может завершиться неудачно по разным причинам. Например, путь, указанный в объекте типа F i l е, уже существует, или каталог не может быть создан, потому что полный путь к нему еще не существует. Чтобы создать каталог, путь к которому еще не создан, следует вызвать метод mkdirs ().Он создаст как сам каталог, так и все его родительские каталоги. 7. Блокирующий и неблокирующий ввод/вывод Потоки ввода/вывода (streams) в Java IO являются блокирующими. Это значит, что когда в потоке выполнения (tread) вызывается read() или write() метод любого класса из пакета java.io.*, происходит блокировка до тех пор, пока данные не будут считаны или записаны. Поток выполнения в данный момент не может делать ничего другого. Неблокирующий режим Java NIO позволяет запрашивать считанные данные из канала (channel) и получать только то, что доступно на данный момент, или вообще ничего, если доступных данных пока нет. Вместо того, чтобы оставаться заблокированным пока данные не станут доступными для считывания, поток выполнения может заняться чем-то другим Декоратор пример. BufferedInputStream – класс-обертка для InputStream (наследует через FilterInputStream). В отличие от InputStream класс BufferedInputStream позволяет предварительно читать в буфер порции байт, что уменьшает количество обращений к файлу. Существует также BufferedOutputStream. Адаптер пример Например, объект File адаптируется к потоку ввода InputStream, т. е. все, что мы хотим получить из File, в конечном итоге мы будем получать из InputStream. Фактически мы работаем с InputStream, через адаптер FileInputStream, который с одной стороны наследуется от InputStream, а с другой – имеет поле, которому присваивается объект File. Дженерики Что такое generic и для чего они нужны? Дженерики (или обобщения) - это параметризованные типы. Параметризованные типы позволяют объявлять классы, интерфейсы и методы, где тип данных, которыми они оперируют, указан в виде параметра. Например, используя дженерики, можно создать единственный класс, который будет автоматически работать с разными типами данных. Что такое wildcard? Wildcard — (сильная карта или символом подстановки) это дженерик, обозначается вопросительным знаком в угловых скобках >, означает, что тип может быть чем угодно. Где используется wildcard? Wildcard может использоваться при создании коллекций List> exp = new ArrayList В параметрах и типе возвращаемого значения метода List> expMethod(List > e); Как используется wildcard? Wldcard позволяет подставить любой тип вместо символа > Что такое принцип PECS? Producer Extends Consumer Super - Поставщик расширяет, потребитель ограничивает. Это означает, что типы используемые в wildcard можно ограничивать сверху и снизу по иерархии. Также называется Bounded Wildcards. Принцип PECS более подробно? Для ограничения используется extends T> и super T>. extends T> - означает что можно использовать всех наследников от типа Т и сам тип Т включительно. super T> - означает что можно использовать только предков типа Т и сам тип Т включительно. Принцип PECS еще? extends Number> - означает что можно использовать Integer, Long, Double и все что наследуется от Number. --------------- Допустим есть класс Car и его наследник Car1 и наследник от Car1 класс Car2. super Car1> - означает что можно использовать сам класс Car1 и класс Car. Т.е. можно использовать только предков. Upper Bounded Wildcards, Lower Bounded Wildcards? Аналогично PECS. Upper Bounded Wildcards - extends T. Lower Bounded Wildcards - super T. Что такое raw type? Raw type (сырые типы) это generic-типы без указания типа-параметра. Например: List listRawType = new ArrayList(); В один лист можно добавить объекты разного типа, например, Integer и String. Какие проблемы могут быть при использовании raw type? Raw type использовать настоятельно не рекомендуется. Он нужен для обратной совместимости. До появления generic в Java 5. При использовании возможна проблема heap pollution - ошибка когда переменная параметризованного типа хранит в себе объект, параметризованный другим типом. В чем отличие ArrayList и ArrayList> ? ArrayList - без указания типа использует raw type. ArrayList> Это лист без конкретного параметра, в него нельзя ничего добавить кроме null. Но его можно использовать например в параметре метода и принимать различные типы листа. Что такое Type Erasure (стирание типов)? Информация о типе параметра дженерика во время компиляции заменяется на Object. При необходимости добавляется явное приведение типов. Что можно параметризовать? Параметризовать можно классы, конструкторы, методы, интерфейсы, поля. Параметризация статических переменных и методов? -Нельзя создавать обобщенные статические переменные и методы. -Можно объявлять статические методы со своими параметрами(отличающимися от параметров класса) Ограничения присущие обобщениям? 1. Нельзя создавать экземпляр по параметру типа. Ни обычный объект, ни массив. Тип экземпляра класса должен быть известен заранее. 2. Нельзя создать массив специфических для типа обобщенных ссылок 3. Нельзя создавать обобщенные статические переменные и методы. Почему в статические методы не передается тип класса? Если статический метод будет привязан к параметрам класса, то может возникнуть такая ситуация, когда экземпляра класса еще не было создан. Так же и со статическими полями и параметрами класса. Как параметризовать статический метод? статический метод параметризуется так же как и обычный - перед типом возвращаемого значения указывается параметр в угловых скобках Что такое даймонд оператор? Это треугольные скобки <>. Даймонд оператор Уменьшает количество кода при использовании дженериков. При создании объекта слева пишется его тип, а с права уже не нужно повторять этот тип, оператор можно оставить пустым.(возможно не для анонимного метода, но это не точно) Почему последняя строчка не скомпилируется? List ArrayList
Потому что дженерики инварианты. Т.е. нельзя приводить конкретный тип к общему. List ArrayList
Что такое ковариантность и контравариантность? Формально, ковариантность/контравариантность типов - это сохранение/обращение порядка наследования для производных типов. Проще говоря, когда у ковариантных сущностей типами-параметрами являются родитель и наследник, они сами становятся как бы родителем и наследником. Контравариантные наоборот, становятся наследником и родителем. Что такое инвариантность? Инвариантность - это отсутствие свойств ковариантности и контрвариантности. Дженерики без вайлдкардов инвариантны: List Инвариантность еще раз? Инвариантность — ситуация, когда наследование исходных типов не переносится на производные. В List Отношение предок-родитель не работает. Это сделано для типобезопасности. Всегда ли Generics инварианты? Нет. только без использования Wildcards. Коллекции Что такое коллекции в Java? Коллекции в Java это классы, основная цель которых - хранить набор других элементов. Коллекции — это наборы однородных элементов. Преимущества использования коллекций? 1. Сокращение усилий по разработке благодаря использованию базовых классов коллекций, а не реализации собственных классов коллекций. 2. Качество и безопасность кода улучшается за счет использования хорошо протестированных базовых классов коллекций. 3. Возможность повторного использования и обратная совместимость с прошлыми версиями Java. 4. Поддержка многопоточного доступа. 5. Возможность динамического увлечения размера в отличии от массивов. С чем работают коллекции а с чем массивы? Коллекции работают с объектами и могут хранить любые ссылочные типы данных. Массивы могут работать с примитивами. Какова иерархия коллекций? На вершине иерархии в Java Collections Framework располагаются 2 интерфейса: Collection и Map. Эти интерфейсы разделяют все коллекции, входящие во фреймворк на две части по типу хранения данных: простые последовательные наборы элементов и наборы пар «ключ — значение» (словари). Основные коллекции интерфейса Collection? Set, List, Queue Основные коллекции интерфейса Map? HashMap, LinkedHashMap, TreeMap, Hashtable Что вы знаете о коллекциях типа List? List — это упорядоченный список. Объекты хранятся в порядке их добавления в список. Доступ к элементам списка осуществляется по индексу. Что вы знаете о коллекциях типа Set? Set — неупорядоченное множество уникальных (неповторяющихся) объектов. В коллекции этого типа разрешено наличие только одной ссылки типа null. Что вы знаете о коллекциях типа Queue? Queue - Очередь. Этот список, который используется для реализации концепции FIFO (first in, first out) — «первым пришёл — первым ушёл». В Queue элементы обычно добавляются в конец. Что вы знаете о коллекциях типа Deque? .Дек - двунаправленая очередь. Расширяет интерфейс Queue. Обычно используется для реализации концепции LIFO (last in - first out) - "последний пришёл первый вышел" или как Stack. Но может выступать роли обычной очереди. Можно добавлять элементы как в начало, так и в конец очереди. Интерфейс Deque позиционируется как современная альтернатива классу Stack. Что вы знаете о коллекциях типа Stack? Стек - это подкласс Vector, который реализует стандартный стек LIFO. Рекомендуется использовать Deque в место Stack. Почему Map не наследуется от Collection? Map не наследуется от Collection, потому что это разные структуры данных. |