Java Core Flashcards
Рассказать про коллекции (иерархия, сложности, как устроены, какие где использовать)
Сollection расширяет три интерфейса: List, Set, Queue.
List - хранит упорядоченные элементы(могут быть одинаковые); Имеет такие реализации как LinkedList, ArrayList и Vector.
Vector - (depricated ) синхронизирован, и поэтому в одном потоке, он работает медленней остальных реализаций.
ArrayList - его преимущество в навигации по коллекции.
LinkedList - Его преимущество во вставке и удалении элементов в коллекции.
Set - коллекции, которые не содержат повторяющихся элементов. Основные реализации: HashSet, TreeSet, LinkedHashSet.
TreeSet - упорядочивает элементы по их значениям;
HashSet - упорядочивает элементы по их хэш ключам, хотя на первый взляд может показаться что элементы хранятся в случайном порядке.
LinkedHashSet - хранит элементы в порядке их добавления
Queue - интерфейс для реализации очереди в джава. Основные реализации: LinkedList, PriorityQueue. Очереди работают по принципу FIFO – first in first out.
Map - интерфейс для реализации так называемой карты, где элементы хранятся с их ключами. Основные реализации: HashTable, HashMap, TreeMap, LinkedHashMap.
HashTable - синхронизированна, <>.
HashMap - порядок элементов рассчитывается по хэш ключу;
TreeMap - элементы хранятся в отсортированном порядке.
LinkedHashMap - элементы хранятся в порядке вставки. Ключи в Мар не могут быть одинаковыми!
Синхронизировать не синхронизированные коллекции и карты можно посредством класса Collections.synchronizedMap(MyMap)\ synchronizedList(MyList).
Hashmap accepts null value and null key
The default initial capacity is 16 and default load factor is 0.75.
When the number of hash map entries exceeds the product of LF and capacity, then rehashing occurs i.e. another internal array is created with twice the size of the initial one and all entries are moved over to new bucket locations in the new array.
модификаторы доступа, какие могут быть у класса, какие у методов, какие у полей класса
В Java существуют следующие модификаторы доступа:
private: (используется конструкторах, внутренних классах, методах и полях класса) - Доступ разрешен только в текущем классе.
default (package-private): (используется в классах, конструкторах, интерфейсах, внутренних классах, методах и полях класса) - Доступ на уровне пакета. Если класс будет так объявлен он будет доступен только внутри пакета.
protected: (используется конструкторах, внутренних классах, методах и полях класса) Модификатор доступа на уровне пакета и в иерархии наследования.
public: (используется в классах, конструкторах, интерфейсах, внутренних классах, методах и полях класса) - Модификатор доступа общественный, доступен всем.
Последовательность модификаторов по убыванию уровня закрытости:
private, default ,protected, public).
******
Protected Access Modifier - Protected. Variables, methods, and constructors, which are declared protected in a superclass can be accessed only by the subclasses in other package or any class within the package of the protected members’ class. The protected access modifier cannot be applied to class and interfaces.
чем абстрактный класс отличается от интерфейса, когда что использовать, какие особенности в джаве 8.
Абстрактный класс это класс, который помечен как “abstract”, он может содержать абстрактные методы, а может их и не содержать. Экземпляр абстрактного класса нельзя создать. Класс, который наследуется от абстрактного класса может реализовывать абстрактные методы, а может и не реализовывать, тогда класс наследник должен быть тоже абстрактным. Также если класс наследник переопределяет реализованный в абстрактном классе родителя метод, его можно переопределить с модификатором абстракт! Т.е отказаться от реализации. Соответственно данный класс должен быть также абстрактным.
Интерфейс, то в нем находятся только абстрактные методы и константы, так было до выхода Java 8. Начиная с Java 8 кроме абстрактных методов мы также можем использовать в интерфейсах стандартные методы (default methods) и статические методы (static methods).
Default метод в интерфейсе - это метод в интерфейсе с по умолчанию реализованной логикой, который не требуется обязательно определять в реализации этого интерфейса.
Static методы в интерфейсе - это по существу то же самое, что static-методы в абстрактном классе. При реализации интерфейса, класс обязан реализовать все методы интерфейса. Иначе класс должен быть помечен как абстрактный. Интерфейс также может содержать внутренние классы. И не абстрактные методы в них.
Что же использовать Интерфейс или Абстрактный класс?
Абстрактный класс используется когда нам нужна какая-то реализация по умолчанию. Интерфейс используется когда классу нужно указать конкретное поведение. Часто интерфейс и абстрактный класс комбинируют, т.е. имплементируют интерфейс в абстрактном классе, чтоб указать поведение и реализацию по умолчанию. Это хорошо видно на примере свига: Мы создаем свою модель таблицы с определенным поведением и уже с реализацией по умолчанию. Дополнение:
- Каковы различия между абстрактным классом и интерфейсом в Java?
Это важнейший и один из самых классических вопросов на собеседованиях по языку Java. Я не могу сосчитать, сколько раз встречал этот вопрос на собеседованиях по Java для всех уровней. Интересным этот вопрос делает, в частности, возможность для соискателя представить пример. Отвечать на вопросы по основам объектно-ориентированного программирования, например, рассказать об абстракции, инкапсуляции, полиморфизме и наследовании, легко, но, когда дело доходит до подобных тонких нюансов, претенденты на должность очень часто теряются и говорят, что первое приходит в голову. Ответ на этот вопрос тянет на отдельную статью (особенно после изменений в Java 8), тем не менее, если кратко:
Интерфейс описывает только поведение (методы) объекта, а вот состояний (полей) у него нет (кроме public static final), в то время как у абстрактного класса они могут быть.
Абстрактный класс наследуется (etxends), а интерфейс — реализуется (implements). Мы можем наследовать только один класс, а реализовать интерфейсов — сколько угодно. Интерфейс может наследовать (extends) другой интерфейс/интерфейсы.
Абстрактные классы используются, когда есть отношение “is-a”, то есть класс-наследник расширяет базовый абстрактный класс, а интерфейсы могут быть реализованы разными классами, вовсе не связанными друг с другом.
Деревья, рассказать что это.
Структура данных которая является по сути графом и не содержащим циклы
Что такое сбалансированное дерево и какая сложность балансировки дерева?
Сбалансированным называется такое двоичное дерево поиска, в котором высота каждого из поддеревьев, имеющих общий корень, отличается не более чем на некоторую величину, такой что поиск по этому дереву можно осуществить со сложностью ~O(log_2(n))
Чем отличается Б-дерево от сбалансированного бинарного дерева ?
B-tree - это структура данных в виде древовидный граф, которая сохраняет хранимые данные в отсортированном виде и позволяет выполнять поиск, вставку и удаление в log time complexity ( у каждой ноды может больше чем 2 наследника ) .
В отличие от самобалансирующихся двоичных деревьев поиска, он оптимизирован для систем, которые читают и записывают большие блоки данных. Он чаще всего используется в базе данных и файловых системах.
Дерево называют бинарным, если у каждого элемента дерева два потомка.
Коллекции, их сложности, как работает хэшмэп.
Vector, Hashtable, LinkedHashMap, LinkedHashset- deprecated
HashMap — основан на хэш-таблицах, реализует интерфейс Map (что подразумевает хранение данных в виде пар ключ/значение). Ключи и значения могут быть любых типов, в том числе и null. Данная реализация не дает гарантий относительно порядка элементов с течением времени. Разрешение коллизий осуществляется с помощью метода цепочек.
******
LinkedList — ещё одина реализация List. Позволяет хранить любые данные, включая null. Особенностью реализации данной коллекции является то, что в её основе лежит двунаправленный связный список (каждый элемент имеет ссылку на предыдущий и следующий). Благодаря этому, добавление и удаление из середины, доступ по индексу, значению происходит за линейное время O(n), а из начала и конца за константное O(1). Так же, ввиду реализации, данную коллекцию можно использовать как стек или очередь.
ArrayList, LinkedList
Отличие заключается в способе хранения данных. ArrayList хранит в виде массива, а LinkedList - в виде списка (двунаправленного).
В ArrayList быстрее происходит поиск элемента и сортировка , т.к. для ее выполнения данные списка копируются в массив (а копировать из массива ArrayList в массив для сортировки быстрее). При большом числе операций добавления и удаления LinkedList должен быть более удачным выбором, т.к. при этих операциях не приходится перемещать части массива.
Если при добавлении в ArrayList превышается его объем, размер массива увеличивается, новая емкость рассчитывается по формуле (oldCapacity * 3) / 2 + 1, поэтому лучше указывать размер при создании или, если он не известен, использовать LinkedList (но это может быть существенно при слишком уж больших объемах данных).
что такое автобоксинг. что будет если передадим Integer равный null в метод который принимает инт.
Autoboxing/Unboxing - автоматическое преобразование между скалярными типами Java и соответствующими типами-врапперами (например, между int - Integer).
Наличие такой возможности сокращает код, поскольку исключает необходимость выполнения явных преобразований типов в очевидных случаях.
какие типы в джаве, где что хранится.
- Примитивные типы ;
- целочисленные 1.2. типы с плавающей точкой ; 1.3. логические типы - храняться в стеке ;
- ссылочные типы 2.1. Стринг 2.2. обертки над примитивами - храняться в хипе
контракт equals и hashcode, свойства equals .
Используйте оператор == чтобы проверить ссылку на объект, переданную в метод equals. Если ссылки совпадают - вернуть true. Это не обязательно, нужно скорее для оптимизации, но может сэкономить время в случае “тяжёлых” сравнений.
ЕСЛИ ВЫ ХОТИТЕ ПЕРЕОПРЕДЕЛИТЬ EQUALS(), КАКИЕ УСЛОВИЯ ДОЛЖНЫ УДОВЛЕТВОРЯТЬСЯ ДЛЯ ПЕРЕОПРЕДЕЛЕННОГО МЕТОДА?
Метод equals() обозначает отношение эквивалентности объектов. Эквивалентным называется отношение, которое является симметричным, транзитивным и рефлексивным.
Рефлексивность: для любого ненулевого x, x.equals(x) вернет true;
Транзитивность: для любого ненулевого x, y и z, если x.equals(y) и y.eqals(z) вернет true, тогда и x.equals(z) вернет true;
Симметричность: для любого ненулевого x и y, x.equals(y) должно вернуть true, тогда и только тогда, когда y.equals(x) вернет true. Также для любого ненулевого x, x.equals(null) должно вернуть false.
Контракт заключается в том, что если ты переопределил equals, то нужно переопределить и hashcode
**************
Если у объектов одинаковый hashcode, то это не значит что они равны. -> нужно проверить через equals. Если объекты равны, то у них одниковый hashcode.
иерархия эксепшенов, привести пример когда вылетит ConcurrentModificationException, что такое Error и RuntimeException, привести примеры.
https://jsehelper.blogspot.com/2016/01/java-core-3.html
ОПИШИТЕ ИЕРАРХИЮ ИСКЛЮЧЕНИЙ.
Все классы-исключения расширяют класс Throwable - непосредственное расширение класса object. У класса Throwable и у всех его расширений по традиции два конструктора: Throwable о - конструктор по умолчанию; Throwable (String message) - создаваемый объект будет содержать произвольное сообщение message. Записанное в конструкторе сообщение можно получить затем методом getMessage (). Если объект создавался конструктором по умолчанию, то данный метод возвратит null. Метод toString возвращает краткое описание события, именно он работал в предыдущих листингах. Три метода выводят сообщения обо всех методах, встретившихся по пути “полета” исключения: printstackTrace() - выводит сообщения в стандартный вывод, как правило, это консоль; printStackTrace(PrintStream stream) - выводит сообщения в байтовый поток stream; printStackTrace(PrintWriter stream) - выводит сообщения в символьный поток stream. У класса Throwable два непосредственных наследника - классы Error и Exception. Они не добавляют новых методов, а служат для разделения классов-исключений на два больших семейства - семейство классов-ошибок (error) и семейство собственно классов-исключений (exception). Классы-ошибки, расширяющие класс Error, свидетельствуют о возникновении сложных ситуаций в виртуальной машине Java. Их обработка требует глубокого понимания всех тонкостей работы JVM. Ее не рекомендуется выполнять в обычной программе. Не советуют даже выбрасывать ошибки оператором throw. He следует делать свои классы-исключения расширениями класса Error или какого-то его подкласса. Имена классов-ошибок, по соглашению, заканчиваются словом Error. Классы-исключения, расширяющие класс Exception, отмечают возникновение обычной нештатной ситуации, которую можно и даже нужно обработать. Такие исключения следует выбросить оператором throw. Классов-исключений очень много, более двухсот. Они разбросаны буквально по всем пакетам J2SDK. В большинстве случаев вы способны подобрать готовый класс-исключение для обработки исключительных ситуаций в своей программе. При желании можно создать и свой класс-исключение, расширив класс Exception или любой его подкласс. Среди классов-исключений выделяется класс RuntimeException - прямое расширение класса Exception. В нем и его подклассах отмечаются исключения, возникшие при работе JVM, но не столь серьезные, как ошибки. Их можно обрабатывать и выбрасывать, расширять своими классами, но лучше доверить это JVM, поскольку чаще всего это просто ошибка в программе, которую надо исправить. Особенность исключений данного класса в том, что их не надо отмечать в заголовке метода пометкой throws. Имена классов-исключений, по соглашению, заканчиваются словом Exception.
ConcurrentModificationException- Это исключительная ситуация которая возникает, когда модифицируем коллекцию во время прохождения по ней итератором, не используя итератор.
The Iterator throws a ConcurrentModificationException if the Map gets modified in any way and at any time once the iterator has been created.
Additionally, we can use the iterator’s remove method to alter the Map during iteration.
как работает квиксорт, сложность.
Худшее время O(n2)
Лучшее время O(n log n) (обычное разделение)
Выбрать элемент назвать его опорным. Сравнить все остальные элементы с опорным и переставить их в массиве так, чтобы разбить массив на три или два непрерывных отрезка, следующие друг за другом: «меньшие опорного», «равные» и «большие».
Для отрезков «меньших» и «больших» значений выполнить рекурсивно ту же последовательность операций, если длина отрезка больше единицы.
https://visualgo.net/bn/sorting?slide=1
https://prnt.sc/mcg6g2 сложность
методы интерфейса итератор
Все коллекции из java.util реализуют интерфейс Collection, который, в свою очередь, расширяет интерфейс Iterable.
В интерфейсе Iterable описан только один метод: Iterator iterator();
Он возвращает Iterator, т.е. объект, который поочерёдно возвращает все элементы коллекции.
Алгоритмы сортировки. Сложности. В чем измеряется сложность ?
Buble sort худший вариант O(n^2), лучший O(n) ; insert Sort ; quick sort ; mergeSort ; TimSort ,
в Java используется Timsort, см в телеграме аудио
Insert sort -пример колода карт, разделяешь ее и потом вставляешь; пузырьковая - это каждый элемент сравнивается и больший переносится влево ( пример пальцы переставляются элементы)
Как создать параллельный стрим в Java8
Чтобы сделать обычный последовательный поток параллельным, надо вызвать у объекта Stream метод parallel().
Кроме того, можно также использовать метод parallelStream() интерфейса Collection для создания параллельного потока из коллекции.
В то же время если рабочая машина не является многоядерной, то поток будет выполняться как последовательный.
Следующий фрагмент кода, выводит количество пустых строк с помощью метода parallelStream.