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.
Какие ещё структуры данных основанные на деревьях знаю, кроме ред-блэк три.
АВЛ-дерево — сбалансированное по высоте двоичное дерево поиска: для каждой его вершины высота её двух поддеревьев различается не более чем на 1.
AVL tree AVL tree is a self-balancing Binary Search Tree (BST) where the difference between heights of left and right subtrees cannot be more than one for all nodes. Like red-black trees, they are not perfectly balanced, but pairs of sub-trees differ in height by at most 1, maintaining an O(logn) search time.

Какие методы есть в Object
Object это базовый класс для всех остальных объектов в Java.
Каждый класс наследуется от Object. Соответственно все классы наследуют методы класса Object.
Методы класса Object:
public final native Class getClass()
public native int hashCode()
public boolean equals(Object obj)
protected native Object clone() throws CloneNotSupportedException
public String toString()
public final native void notify()- из многопоточности public final native void notifyAll()-из многопоточности public final native void wait(long timeout) throws InterruptedException-из многопоточности
public final void wait(long timeout, int nanos) throws InterruptedException
public final void wait() throws InterruptedException protected void finalize() throws Throwable
Рассказать про finalize
Метод finalize(). Java обеспечивает механизм, который является аналогичным использованию деструкторов в С ++, который может использоваться для того, чтобы произвести процесс очистки перед возвращением управления операционной системе.
Но в продакшен этот метот не рекомендуется употреблять скорее всего этот метод будет deprecated в следующих версиях java Дополнение:
Применяя метод finalize(), можно определять специальные действия, которые будут выполняться тогда, когда объект будет использоваться сборщиком мусора. Данный метод вызывается при уничтожении объекта автоматическим сборщиком мусора (garbage collector). В классе Object он ничего не делает, однако в классе-наследнике позволяет описать все действия, необходимые для корректного удаления объекта, такие как закрытие соединений с БД, сетевых соединений, снятие блокировок на файлы и т.д. В обычном режиме напрямую этот метод вызывать не нужно, он отработает автоматически. Если необходимо, можно обратиться к нему явным образом.
Его синтаксис: protected void finalize( ) throws Throwable
Написать метод, который принимает Integer и возвращает String представление числа. toString конкатенацию и прочее нельзя использовать || Написать метод, который принимаем String и возвращает Integer
через autoboxing это можно реализовать
Пример:
/* package whatever; // don’t place package name! */ import java.util.*;
import java.lang.*;
import java.io.*;
/* Name of the class has to be “Main” only if the class is public. */
class Ideone
{ public static void main (String[] args) throws java.lang.Exception
{ // your code goes here
Integer i = new Integer(new String(“1”)) ; System.out.println(i);
// String str = new String(new Integer(1)); // not working // String str = new String((new Integer(“11”)).toString()); // working
String str = “” ; String str1 = str.concat(“111”); System.out.println(str1);
String str2 = “” + 100;
System.out.println(str2); }
Set myStrings = new TreeSet\<\>(new Comparator() { @Override public int compare(Players o1, Players o2) { // Define comparing logic here return o1.getRank - (o2.getRank); } }); }
Методы интерфейса Collection
например size(), isEmpty(), add(E e)
интерфейсы наследники это list , queue , set - интерфейс map стоит отдельно
Comparable \ Comparator
interface Comparable -> override compare To
но когда не хотим изменять класс мы используем интерфейс Comparator< T > override compare - и передаем этот компоратор например в Collection.sort как второй аргумент для сравнения
Дополнение: The Comparator interface defines a compare(arg1, arg2) method with two arguments which represent compared objects and works similarly to the Comparable.compareTo() method. Comparable is an interface defining a strategy of comparing an object with other objects of the same type. This is called the class’s “natural ordering”.
Дополнение:
- В чем разница между интерфейсами Comparable и Comparator?
В Java все коллекции, поддерживающие автоматическую сортировку, используют методы сравнения для того чтобы правильно рассортировать элементы. В качестве примера таких классов мы можем указать TreeSet, TreeMap и т.д.
Для того чтобы рассортировать элементы, класс должен реализовать интерфейсы Comparator или Comparable. Именно поэтому классы-обертки как Integer, Double и String реализуют интерфейс Comparable.
Интерфейс Comparable помогает сохранять естественную сортировку, тогда как Comparator позволяет сортировать элементы по разным особым шаблонам. Экземпляр компаратора обычно передается конструктору коллекции, если коллекция это поддерживает. Следует отметить, что интерфейс Comparable может быть реализован именно элементами коллекции или ключами Map, а Comparatorреализуется отдельным объектом (это удобно, так как можно заготовить несколько реализаций для разных правил сортировок, не меняя при этом код элементов коллекции/ключей Map).
пример: футбольная команда
Т.е. интерфейс Comparator он как надстройка для класса,он извне идет, т.е. его берут для настройки сравнения, а Comparable он уже есть внутри класса
http://java-online.ru/blog-comparator.xhtml
**************
Что такое интерфейсы Comparable и Comparator?
В Java, все коллекции поддерживающие автоматическую сортировку, используют методы сравнения для того чтобы правильно рассортировать элементы. В качестве примера таких классов мы можем указать TreeSet, TreeMap и т.д. Для того чтобы рассортировать элементы, класс должен реализовать интерфейсы Comparator или Comparable. Именно поэтому классы-обертки как Integer, Double и String реализуют интерфейс Comparable. Интерфейс Comparableпомогает сохранять естественную сортировку, тогда как Comparator позволяет сортировать элементы по разным особым шаблонам. Экземпляр компаратора обычно передается конструктору коллекции, если коллекция это поддерживает.
(Снова объясняю по другому. Интерфейс Comparator описывает метод int compare(T o1, T o2), то есть объект реализующий этот интерфейс может быть использован для сравнения двух других объектов одного класса. Если данный метод вернет 0 — объекты равны, +1 и -1 говорят о том что первый объект “больше” второго или наоборот. Какой смысл вы вложите в понятие “больше” и “меньше” применительно к вашим объектам — исключительно ваше дело. То есть — вы описываете класс, реализующий интерфейс Сomparator, и в данном методе определяете как вы хотите сравнивать ваши объекты. Потом передаете объект этого класса конструктору коллекции, в которой хранятся объекты сравниваемые данным методом, и коллекция сможет их сортировать по возрастанию/убыванию. Повторяю — у вас есть коллекция в которой хранятся объекты класса T, и есть еще один объект, другого класса, реализующего интерфейс Comparator, вся суть которого в том что он умеет сравнивать эти объекты класса T, больше он ни для чего не нужен.
Интерфейс Comparable описывает метод int compareTo(T o), то есть вызывается он не для сравнения двух других объектов, а для сравнения себя самого с кем-то еще. То есть, вам не нужен отдельный объект-сравниватель, вы закладываете механизм сравнения в сам элемент хранящийся в коллекции. Что и в какой ситуации удобнее – решать вам.(Прим. пер.))
************
Q7. What Is the Difference Between the Comparable and ComparatorInterfaces?
Sometimes when we write a new class, we would like to be able to compare objects of that class. It’s especially helpful when we want to use sorted collections. There are two ways we can do this: with the Comparable interface or with the Comparator interface.
First, let’s look at the Comparable interface:
1
2
3
public interface Comparable<t> {</t>
int compareTo(T var1);
}
We should implement that interface by the class whose objects we want to sort.
It has the compareTo() method and returns an integer. It can return three values: -1, 0, and 1 which means that this object is less than, equal to or greater than the compared object.
It’s worth mentioning that the overridden compareT0() method should be consistent with the equals() method.
On the other hand, we can use the Comparator interface. It can be passed to the sort() methods of the Collection interface or when instantiating sorted collections. That’s why it’s mostly used to create a one-time sorting strategy.
What’s more, it’s also useful when we use a third-party class which doesn’t implement the Comparable interface.
Like the compareTo() method, the overridden compare() methods should be consistent with the equals() method, but they may optionally allow comparison with nulls.
Let’s visit the Comparator and Comparable in Java article for more information.
Можно ли отловить Error?
ЧТО ТАКОЕ ERROR?
Исключения, порожденные от Error – unckecked . Они предназначены для того, чтобы уведомить приложение о возникновении фатальной ситуации, которую программным способом устранить практически невозможно (хотя формально обработчик допускается). Они могут свидетельствовать об ошибках программы, но, как правило, это неустранимые проблемы на уровне JVM.
В качестве примера можно привести StackOverflowError (переполнение стека), OutOfMemoryError (нехватка памяти). Методы, код которых может порождать проверяемые исключения, должны либо сами их обрабатывать, либо в заголовке метода должно быть указано ключевое слово throws с перечислением необрабатываемых проверяемых исключений. На непроверяемые ошибки это правило не распространяется.
Можно ли наследоваться от Exception/Throwable/
Error/RuntimeException?
Унаследоваться от RuntimeException. == КАК СОЗДАТЬ СВОЙ UNCHECKED EXCEPTION?

