Java Core Flashcards

1
Q

Рассказать про коллекции (иерархия, сложности, как устроены, какие где использовать)

A

С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).

https://prnt.sc/mcga05

http://prntscr.com/nk0g22

http://prntscr.com/nk0gau

http://prntscr.com/nk0gh1

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.

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

модификаторы доступа, какие могут быть у класса, какие у методов, какие у полей класса

A

В 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.

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

чем абстрактный класс отличается от интерфейса, когда что использовать, какие особенности в джаве 8.

A

Абстрактный класс это класс, который помечен как “abstract”, он может содержать абстрактные методы, а может их и не содержать. Экземпляр абстрактного класса нельзя создать. Класс, который наследуется от абстрактного класса может реализовывать абстрактные методы, а может и не реализовывать, тогда класс наследник должен быть тоже абстрактным. Также если класс наследник переопределяет реализованный в абстрактном классе родителя метод, его можно переопределить с модификатором абстракт! Т.е отказаться от реализации. Соответственно данный класс должен быть также абстрактным.

Интерфейс, то в нем находятся только абстрактные методы и константы, так было до выхода Java 8. Начиная с Java 8 кроме абстрактных методов мы также можем использовать в интерфейсах стандартные методы (default methods) и статические методы (static methods).

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

Static методы в интерфейсе - это по существу то же самое, что static-методы в абстрактном классе. При реализации интерфейса, класс обязан реализовать все методы интерфейса. Иначе класс должен быть помечен как абстрактный. Интерфейс также может содержать внутренние классы. И не абстрактные методы в них.

Что же использовать Интерфейс или Абстрактный класс?

Абстрактный класс используется когда нам нужна какая-то реализация по умолчанию. Интерфейс используется когда классу нужно указать конкретное поведение. Часто интерфейс и абстрактный класс комбинируют, т.е. имплементируют интерфейс в абстрактном классе, чтоб указать поведение и реализацию по умолчанию. Это хорошо видно на примере свига: Мы создаем свою модель таблицы с определенным поведением и уже с реализацией по умолчанию. Дополнение:

  1. Каковы различия между абстрактным классом и интерфейсом в Java?

Это важнейший и один из самых классических вопросов на собеседованиях по языку Java. Я не могу сосчитать, сколько раз встречал этот вопрос на собеседованиях по Java для всех уровней. Интересным этот вопрос делает, в частности, возможность для соискателя представить пример. Отвечать на вопросы по основам объектно-ориентированного программирования, например, рассказать об абстракции, инкапсуляции, полиморфизме и наследовании, легко, но, когда дело доходит до подобных тонких нюансов, претенденты на должность очень часто теряются и говорят, что первое приходит в голову. Ответ на этот вопрос тянет на отдельную статью (особенно после изменений в Java 8), тем не менее, если кратко:

Интерфейс описывает только поведение (методы) объекта, а вот состояний (полей) у него нет (кроме public static final), в то время как у абстрактного класса они могут быть.

Абстрактный класс наследуется (etxends), а интерфейс — реализуется (implements). Мы можем наследовать только один класс, а реализовать интерфейсов — сколько угодно. Интерфейс может наследовать (extends) другой интерфейс/интерфейсы.

Абстрактные классы используются, когда есть отношение “is-a”, то есть класс-наследник расширяет базовый абстрактный класс, а интерфейсы могут быть реализованы разными классами, вовсе не связанными друг с другом.

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

Деревья, рассказать что это.

A

Структура данных которая является по сути графом и не содержащим циклы

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

Что такое сбалансированное дерево и какая сложность балансировки дерева?

A

Сбалансированным называется такое двоичное дерево поиска, в котором высота каждого из поддеревьев, имеющих общий корень, отличается не более чем на некоторую величину, такой что поиск по этому дереву можно осуществить со сложностью ~O(log_2(n))

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

Чем отличается Б-дерево от сбалансированного бинарного дерева ?

A

B-tree - это структура данных в виде древовидный граф, которая сохраняет хранимые данные в отсортированном виде и позволяет выполнять поиск, вставку и удаление в log time complexity ( у каждой ноды может больше чем 2 наследника ) .

В отличие от самобалансирующихся двоичных деревьев поиска, он оптимизирован для систем, которые читают и записывают большие блоки данных. Он чаще всего используется в базе данных и файловых системах.

Дерево называют бинарным, если у каждого элемента дерева два потомка.

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

Коллекции, их сложности, как работает хэшмэп.

A

Vector, Hashtable, LinkedHashMap, LinkedHashset- deprecated

HashMap — основан на хэш-таблицах, реализует интерфейс Map (что подразумевает хранение данных в виде пар ключ/значение). Ключи и значения могут быть любых типов, в том числе и null. Данная реализация не дает гарантий относительно порядка элементов с течением времени. Разрешение коллизий осуществляется с помощью метода цепочек.

******

LinkedList — ещё одина реализация List. Позволяет хранить любые данные, включая null. Особенностью реализации данной коллекции является то, что в её основе лежит двунаправленный связный список (каждый элемент имеет ссылку на предыдущий и следующий). Благодаря этому, добавление и удаление из середины, доступ по индексу, значению происходит за линейное время O(n), а из начала и конца за константное O(1). Так же, ввиду реализации, данную коллекцию можно использовать как стек или очередь.

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

ArrayList, LinkedList

A

Отличие заключается в способе хранения данных. ArrayList хранит в виде массива, а LinkedList - в виде списка (двунаправленного).

В ArrayList быстрее происходит поиск элемента и сортировка , т.к. для ее выполнения данные списка копируются в массив (а копировать из массива ArrayList в массив для сортировки быстрее). При большом числе операций добавления и удаления LinkedList должен быть более удачным выбором, т.к. при этих операциях не приходится перемещать части массива.

Если при добавлении в ArrayList превышается его объем, размер массива увеличивается, новая емкость рассчитывается по формуле (oldCapacity * 3) / 2 + 1, поэтому лучше указывать размер при создании или, если он не известен, использовать LinkedList (но это может быть существенно при слишком уж больших объемах данных).

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

что такое автобоксинг. что будет если передадим Integer равный null в метод который принимает инт.

A

Autoboxing/Unboxing - автоматическое преобразование между скалярными типами Java и соответствующими типами-врапперами (например, между int - Integer).

Наличие такой возможности сокращает код, поскольку исключает необходимость выполнения явных преобразований типов в очевидных случаях.

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

какие типы в джаве, где что хранится.

A
  1. Примитивные типы ;
    1. целочисленные 1.2. типы с плавающей точкой ; 1.3. логические типы - храняться в стеке ;
  2. ссылочные типы 2.1. Стринг 2.2. обертки над примитивами - храняться в хипе
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

контракт equals и hashcode, свойства equals .

A

Используйте оператор == чтобы проверить ссылку на объект, переданную в метод 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.

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

иерархия эксепшенов, привести пример когда вылетит ConcurrentModificationException, что такое Error и RuntimeException, привести примеры.

A

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.

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

как работает квиксорт, сложность.

A

Худшее время O(n2)

Лучшее время O(n log n) (обычное разделение)

Выбрать элемент назвать его опорным. Сравнить все остальные элементы с опорным и переставить их в массиве так, чтобы разбить массив на три или два непрерывных отрезка, следующие друг за другом: «меньшие опорного», «равные» и «большие».

Для отрезков «меньших» и «больших» значений выполнить рекурсивно ту же последовательность операций, если длина отрезка больше единицы.

https://visualgo.net/bn/sorting?slide=1

https://prnt.sc/mcg6g2 сложность

https://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8 алгоритм

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

методы интерфейса итератор

A

Все коллекции из java.util реализуют интерфейс Collection, который, в свою очередь, расширяет интерфейс Iterable.

В интерфейсе Iterable описан только один метод: Iterator iterator();

Он возвращает Iterator, т.е. объект, который поочерёдно возвращает все элементы коллекции.

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

Алгоритмы сортировки. Сложности. В чем измеряется сложность ?

A

Buble sort худший вариант O(n^2), лучший O(n)​ ; insert Sort ; quick sort ; mergeSort ; TimSort ,

http://prntscr.com/nn7isp

в Java используется Timsort, см в телеграме аудио

Insert sort -пример колода карт, разделяешь ее и потом вставляешь; пузырьковая - это каждый элемент сравнивается и больший переносится влево ( пример пальцы переставляются элементы)​

https://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8

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

Как создать параллельный стрим в Java8

A

Чтобы сделать обычный последовательный поток параллельным, надо вызвать у объекта Stream метод parallel().

Кроме того, можно также использовать метод parallelStream() интерфейса Collection для создания параллельного потока из коллекции.

В то же время если рабочая машина не является многоядерной, то поток будет выполняться как последовательный.

Следующий фрагмент кода, выводит количество пустых строк с помощью метода parallelStream.

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

Какие ещё структуры данных основанные на деревьях знаю, кроме ред-блэк три.

A

АВЛ-дерево — сбалансированное по высоте двоичное дерево поиска: для каждой его вершины высота её двух поддеревьев различается не более чем на 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.

18
Q

Какие методы есть в Object

A

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

19
Q

Рассказать про finalize

A

Метод finalize(). Java обеспечивает механизм, который является аналогичным использованию деструкторов в С ++, который может использоваться для того, чтобы произвести процесс очистки перед возвращением управления операционной системе.

Но в продакшен этот метот не рекомендуется употреблять скорее всего этот метод будет deprecated в следующих версиях java Дополнение:

Применяя метод finalize(), можно определять специальные действия, которые будут выполняться тогда, когда объект будет использоваться сборщиком мусора. Данный метод вызывается при уничтожении объекта автоматическим сборщиком мусора (garbage collector). В классе Object он ничего не делает, однако в классе-наследнике позволяет описать все действия, необходимые для корректного удаления объекта, такие как закрытие соединений с БД, сетевых соединений, снятие блокировок на файлы и т.д. В обычном режиме напрямую этот метод вызывать не нужно, он отработает автоматически. Если необходимо, можно обратиться к нему явным образом.

Его синтаксис: protected void finalize( ) throws Throwable

20
Q

Написать метод, который принимает Integer и возвращает String представление числа. toString конкатенацию и прочее нельзя использовать || Написать метод, который принимаем String и возвращает Integer

A

через 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);
}
});
}
21
Q

Методы интерфейса Collection

A

например size(), isEmpty(), add(E e)

интерфейсы наследники это list , queue , set - интерфейс map стоит отдельно

22
Q

Comparable \ Comparator

A

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”.

Дополнение:

  1. В чем разница между интерфейсами 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.

23
Q

Можно ли отловить Error?

A

ЧТО ТАКОЕ ERROR?

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

В качестве примера можно привести StackOverflowError (переполнение стека), OutOfMemoryError (нехватка памяти). Методы, код которых может порождать проверяемые исключения, должны либо сами их обрабатывать, либо в заголовке метода должно быть указано ключевое слово throws с перечислением необрабатываемых проверяемых исключений. На непроверяемые ошибки это правило не распространяется.

24
Q

Можно ли наследоваться от Exception/Throwable/

Error/RuntimeException?

A

Унаследоваться от RuntimeException. == КАК СОЗДАТЬ СВОЙ UNCHECKED EXCEPTION?

25
Q

Почему рантайм можем не обрабатывать?

A

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

26
Q

Для чего нужен Reflection API, назвать классы\методы.

A

Рефлекшен - это механизм исследования данных о программе во время её выполнения. Рефлексия позволяет исследовать информацию о полях, методах и конструкторах классов. Можно также выполнять операции над полями и методами которые исследуются. Рефлексия в Java осуществляется с помощью Java Reflection API. Этот интерфейс API состоит из классов пакетов java.lang и java.lang.reflect. С помощью интерфейса Java Reflection API можно делать следующее: Определить класс объекта. Получить информацию о модификаторах класса, полях, методах, конструкторах и суперклассах. Выяснить, какие константы и методы принадлежат интерфейсу. Создать экземпляр класса, имя которого неизвестно до момента выполнения программы. Получить и установить значение свойства объекта. Вызвать метод объекта. Создать новый массив, размер и тип компонентов, которого неизвестны до момента выполнения программ.

27
Q

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

A

Вообще доступ у приватной переменной класса можно получить только внутри класса, в котором она объявлена. Также доступ к приватным переменным можно осуществить через механизм Java Reflection API.

28
Q

Можем ли создать инстанс статик класса? Если можем, то для чего это делать?

A

Статик класс это вложенный класс и можно реализовать через Singleton (Одиночка)

https://www.baeldung.com/java-static

29
Q

Как появились wildcards? Для чего они? Чем отличается от Extends Object>? можно ли и почему?

A

Повышают реюзабилити кода. Если мы откроем openJDK имплиментацию методов из Java Collection API там все на wild картах построенно Запись

Predicate super V> означает “предикат от V или любого супертипа V (вплоть до Object)”

30
Q

Методы стрим апи? как сконвертировать коллекцию с помощью апи? разница flatMap и map. Терминальный ли метод forEach? ForEach vs Peek

A

filter , map , flatMap , collect ,

31
Q

Виды циклов, чем ограничена рекурсия? Как рекурсия работает(вкратце).

A

рекурсия - это средство, которое позволяет методу вызывать самого себя. Такой метод называется рекурсивным. Классическим примером рекурсии служит вычисление факториала числа. Факториал числа N - это произведение всех целых чисел от 1 до N.

Неправильное использование рекурсии может привести к переполнению стека и к огромным вычислительным затратам. Рекурсия в java 8 ограничина глубиной 50

32
Q

КАКАЯ СВЯЗЬ МЕЖДУ HASHCODE И EQUALS?

A

Объекты равны, когда

a.equals(b)=true и a.hashCode==b.hashcode ->true

Но необязательно, чтобы два различных объекта возвращали различные хэш коды(такая ситуация называется коллизией).

*****

Если у объектов одинаковый hashcode то это не значит что они равны, в java запускается проверка на equals.

Если объекты равны, то у них одинаковый hashcode.

33
Q

КАКИЕ ВИДЫ ИСКЛЮЧЕНИЙ В JAVA ВЫ ЗНАЕТЕ, ЧЕМ ОНИ ОТЛИЧАЮТСЯ?

A

Все исключительные ситуации можно разделить на две категории: проверяемые(checked) и непроверяемые(unchecked). Все исключения, порождаемые от Throwable, можно разбить на три группы. Они определяются тремя базовыми типами: наследниками Throwable - классами Errorи Exception, а также наследником Exception - RuntimeException.

Ошибки, порожденные от Exception (и не являющиеся наследниками RuntimeException ), являются проверяемыми. Т.е. во время компиляции проверяется, предусмотрена ли обработка возможных исключительных ситуаций. Как правило, это ошибки, связанные с окружением программы (сетевым, файловым вводом-выводом и др.), которые могут возникнуть вне зависимости от того, корректно написан код или нет. Например, открытие сетевого соединения или файла может привести к возникновению ошибки и компилятор требует от программиста предусмотреть некие действия для обработки возможных проблем. Таким образом повышается надежность программы, ее устойчивость при возможных сбоях.

Исключения, порожденные от RuntimeException, являются непроверяемыми и компилятор не требует обязательной их обработки. Как правило, это ошибки программы, которые при правильном кодировании возникать не должны (например, IndexOutOfBoundsException- выход за границы массива, java.lang.ArithmeticException- деление на ноль). Поэтому, чтобы не загромождать программу, компилятор оставляет на усмотрение программиста обработку таких исключений с помощью блоков try-catch.

Исключения, порожденные от Error, также не являются проверяемыми. Они предназначены для того, чтобы уведомить приложение о возникновении фатальной ситуации, которую программным способом устранить практически невозможно (хотя формально обработчик допускается). Они могут свидетельствовать об ошибках программы, но, как правило, это неустранимые проблемы на уровне JVM. В качестве примера можно привести StackOverflowError (переполнение стека), OutOfMemoryError (нехватка памяти).

Методы, код которых может порождать проверяемые исключения, должны либо сами их обрабатывать, либо в заголовке метода должно быть указано ключевое слово throws с перечислением необрабатываемых проверяемых исключений.

На непроверяемые ошибки это правило не распространяется. Переопределенный (overridden) метод не может расширять список возможных исключений исходного метода.

34
Q

РАССКАЖИТЕ ПРО ПРИВЕДЕНИЕ ТИПОВ. ЧТО ТАКОЕ ПОНИЖЕНИЕ И ПОВЫШЕНИЕ ТИПА? КОГДА ВЫ ПОЛУЧАЕТЕ CLASSCASTEXCEPTION?

A

Приведение типов это установка типа переменной или объекта отличного от текущего. В джава есть два вида приведения: автоматическое не автоматическое Автоматическое происходит например: byte-> short->int->long->float->double тоесть если мы расширяем тип, то явное преобразование не требуется, приведение происходит автоматически. Если же мы сужаем, то необходимо явно указывать приведение типа. В случае же с объектами, то мы можем сделать автоматическое приведение от наследника к родителю, но никак не наоборот, тогда вылетит ClassCastException.

35
Q

ЧТО ТАКОЕ GENERICS?

A

“Java Generics” - это технический термин, обозначающий набор свойств языка позволяющих определять и использовать обобщенные типы и методы.

Обобщенные типы или методы отличаются от обычных тем, что имеют типизированные параметры.

Примером дженериков или обобщенных типов может служить библитека с коллекциями в Java.

Например, класс LinkedList - типичный обобщенный тип. Он содержит параметр E, который представляет тип элементов, которые будут храниться в коллекции.

Вместо того, чтобы просто использовать LinkedList, ничего не говоря о типе элемента в списке, мы можем использовать LinkedList String или LinkedList Integer

Создание объектов обобщенных типов происходит посредством замены параметризированных типов реальными типами данных. Класс типа LinkedList - обобщенный тип, который содержит параметр E.

Создание объектов, типа LinkedList String или LinkedList Integer ​называются параметризированными типами, а String и Integer - реальные типы аргументов.

************

Generics — это параметризованные типы. С их помощью можно объявлять классы, интерфейсы и методы, где тип данных указан в виде параметра.

36
Q

Чем отличается Hashmap от Hashtable

A
37
Q

Почему map не collection

38
Q

Iterator/Iterable

39
Q

Как сравниваются элементы коллекции

40
Q

Hashmap collision

A

A collision, or more specifically, a hash code collision in a HashMap, is a situation where two or more key objects produce the same final hash value and hence point to the same bucket location or array index.

This scenario can occur because according to the equals and hashCode contract, two unequal objects in Java can have the same hash code.

It can also happen because of the finite size of the underlying array, that is, before resizing. The smaller this array, the higher the chances of collision.

That said, it’s worth mentioning that Java implements a hash code collision resolution technique which we will see using an example.

Keep in mind that it’s the hash value of the key that determines the bucket the object will be stored in. And so, if the hash codes of any two keys collide, their entries will still be stored in the same bucket.

And by default, the implementation uses a linked list as the bucket implementation.