Главная страница

Ревью 6, Коллекции. Документ Microsoft Word (3). Что такое коллекции в Java


Скачать 47.47 Kb.
НазваниеЧто такое коллекции в Java
АнкорРевью 6, Коллекции
Дата02.11.2022
Размер47.47 Kb.
Формат файлаdocx
Имя файлаДокумент Microsoft Word (3).docx
ТипЛекции
#766773

  1. что такое коллекции в Java?

Коллекции в Java это классы, основная цель которых - хранить набор других элементов.
Коллекции — это наборы однородных элементов.

0.01) Преимущества использования коллекций?

1. Сокращение усилий по разработке благодаря использованию базовых классов коллекций, а не реализации собственных классов коллекций.
2. Качество и безопасность кода улучшается за счет использования хорошо протестированных базовых классов коллекций.
3. Возможность повторного использования и обратная совместимость с прошлыми версиями Java.
4. Поддержка многопоточного доступа.
5. Возможность динамического увлечения размера в отличии от массивов.

0.00) С чем работают коллекции а с чем массивы?

Коллекции работают с объектами и могут хранить любые ссылочные типы данных. Массивы могут работать с примитивами.

  1. Какова иерархия коллекций?

На вершине иерархии в Java Collections Framework располагаются 2 интерфейса: Collection и Map.
Эти интерфейсы разделяют все коллекции, входящие во фреймворк на две части по типу хранения данных: простые последовательные наборы элементов и наборы пар «ключ — значение» (словари).

Основные коллекции интерфейса Collection?

Set, List, Queue
Что такое generic и для чего они нужны?

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

2)Преимущества кода с использованием Generic по сравнению с кодом без Generic:

- Более строгая проверка типов во время компиляции.

- Отсутствие необходимости приведения типов.

Возможность реализации общих алгоритмов, не завязанных на конкретных типах.

3)Что было до дженериков?

До появления дженериков использовались коллекции для хранения объектов любого типа, т.е. непатентованных. Теперь универсальные шаблоны заставляют Java-программиста хранить определенный тип объектов.

4)Что можно поставить в дженерики, что нельзя? Что можно типизировать? Что нельзя параметризировать?

Можно типизировать только ссылочные типы. Нельзя типизировать примитивные типы. Невозможно объявить статические поля, типы которых являются параметрами типа. Невозможно использовать приведение или instanceof с параметризованными типами.
5) Что такое wildcard?

Wildcard — (сильная карта или символом подстановки) это дженерик, обозначается вопросительным знаком в угловых скобках , означает, что тип может быть чем угодно.

6) Где используется wildcard?

Wildcard может использоваться при создании коллекций
List exp = new ArrayList();
В параметрах и типе возвращаемого значения метода
List expMethod(List e);

7) Как используется wildcard?

Wldcard позволяет подставить любой тип вместо символа

8) Что такое принцип PECS?

Producer Extends Consumer Super - Поставщик расширяет, потребитель ограничивает.
Это означает, что типы используемые в wildcard можно ограничивать сверху и снизу по иерархии.
Также называется Bounded Wildcards.

Принцип PECS более подробно?

Для ограничения используется и .
- означает что можно использовать всех наследников от типа Т и сам тип Т включительно.

- означает что можно использовать только предков типа Т и сам тип Т включительно.

Принцип PECS еще?

- означает что можно использовать Integer, Long, Double и все что наследуется от Number.
---------------
Допустим есть класс Car и его наследник Car1 и наследник от Car1 класс Car2.
- означает что можно использовать сам класс Car1 и класс Car. Т.е. можно использовать только предков.

Upper Bounded Wildcards, Lower Bounded Wildcards?

Аналогично PECS. Upper Bounded Wildcards - extends T.
Lower Bounded Wildcards - super T.

9)Что такое даймонд оператор? Что такое raw type? К чему приводит использование raw type? Стирание типов? Что такое стирание и сырые типы?

Основная цель diamoind <> оператора упростить использование универсальных шаблонов при создании объекта . Это позволяет избежать непроверенных предупреждений в программе и делает программу более читаемой.

Raw Types (сырые типы) – Это имя универсального класса или интерфейса без каких-либо аргументов типа. их нужно избегать. Пример сырого типа List <> list = new ArrayList<>; Пример нормального типа List list = new ArrayList<>; Они нужны только для поддержки обратной совместимости кода, «сырые типы» являются не «типобезопасными». Если вы не указали тип, например, своей коллекции, то туда можно запихнуть другой объект любого типа

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

10)Если поле типизировано дженериком, то как в байт коде будет представлен этот тип?

Будет представлен как экземпляр Object.

11)В чем отличие в записях в параметре метода: (Collection collection) и ((Collectionextends T> collection)?

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

12) Параметр vs Аргумент (в дженериках)?

Параметр типа (type parameter). Используются при объявлении дженерик-типов. Например, для Box T — это параметр типа.

Аргумент типа (type argument). Тип объекта, который может использоваться вместо параметра типа. Например, для Box
Paper — это аргумент типа.

13)Статические методы как они типизируются Collection? Как параметризовать статический метод?

Generic-поля  не  могут  быть  статическими,  статические методы не могут иметь  generic-параметры или обращаться к  generic-полям.

Пример
:

public static Foo create(Object o1, Object o2) {}

или:

public static T get(Collection m){

return m.iterator().next();};

14)
Почему последняя строчка не скомпилируется?

List arrayLists = new ArrayList();

ArrayList arrayList = new ArrayList();

Слева и справа разные типы, у дженериков нет наследования в данном виде.

1
5)Что произойдет? Почему отработает 2 метод? Как это исправить?

public class Ex1 {

 
public static void main(String[] args) {
   List integerList = Arrays.asList(1, 2, 3);
Gen gen = new Gen();
gen.m(integerList);


static class Gen {
    void m(Collection collection) {
     for (T s : collection) {
       System.out.println(s);
}
}


   
 void m(List list) {
     for (String s : list) {
       System.out.println(s);
}
  }
}}


Вылетит исключение ClassCastException. Нужно добавить WildCard, отработает первый метод:

Gen<> gen = new Gen();

16)Какие структуры данных вы знаете?

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



  • Массив (Array)



  • Стек (Stack)



  • Очередь (Queue)



  • Связный список (Linked List)



  • Дерево (Tree)



  • Граф (Graph)



  • Префиксное дерево (Trie)



  • Хэш-Таблица (Hash Table)



17)Отличие коллекции от массива?

Массивы - это простые конструкции фиксированного размера, и поэтому они могут хранить только заданное количество элементов. Массивы встроены в ядро языка Java, и используемый при работе с ними синтаксис Java очень прост и понятен. Например, чтобы получить элемент массива с номером n, вам нужно вызвать функцию array[n]. Коллекции - это более сложный, но в то же время более гибкий тип данных. Прежде всего, размер коллекции можно изменять: вы можете добавлять в коллекцию любое количество элементов. Коллекции автоматически обрабатывают удаление элемента из любой позиции.

18)На чём основаны основные реализации коллекций.

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

Set — это неупорядоченное множество уникальных элементов.

Queue — очередь. В таком списке элементы можно добавлять только в хвост, а удалять — только из начала. Так реализуется концепция 
FIFO (first in, first out) — «первым пришёл — первым ушёл».

Map состоит из пар «ключ-значение». 
Ключи уникальны, а значения могут повторяться. Порядок элементов не гарантирован. Map позволяет искать объекты (значения) по ключу.

Map не наследуется от интерфейса Collection, но входит в состав фреймворка Collections.

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

add(Objecto)

Добавление элемента в коллекцию, если он отсутствует. Возвращает true, если элемент добавлен.

addAll(Collection c)

Добавление элементов коллекции, если они отсутствуют.

clear()

Очистка коллекции.

contains(Objecto)

Проверка присутствия элемента в наборе. Возвращает true, если элемент найден.

containsAll(Collection c)

Проверка присутсвия коллекции в наборе. Возвращает true, если все элементы содержатся в наборе.

equals(Object o)

Проверка на равенство.

hashCode()

Получение hashCode набора.

isEmpty()

Проверка наличия элементов. Возвращает true если в коллекции нет ни одного элемента.

iterator()

Функция получения итератора коллекции.

remove(Object o)

Удаление элемента из набора.

removeAll(Collection c)

Удаление из набора всех элементов переданной коллекции.

retainAll(Collection c)

Удаление элементов, не принадлежащих переданной коллекции.

size()

Количество элементов коллекции

toArray()

Преобразование набора в массив элементов.

toArray(T[] a)

Преобразование набора в массив элементов. В отличии от предыдущего метода, который возвращает массив объектов типа Object, данный метод возвращает массив объектов типа, переданного в параметре.



20) В чем отличие ArrayList и ArrayList ?

ArrayList - без указания типа использует raw type.
ArrayList Это лист без конкретного параметра, в него нельзя ничего добавить кроме null.
Но его можно использовать например в параметре метода и принимать различные типы листа.

Что такое Type Erasure (стирание типов)?

Информация о типе параметра дженерика во время компиляции заменяется на Object. При необходимости добавляется явное приведение типов.

21) Основные коллекции интерфейса Map?

HashMap, LinkedHashMap, TreeMap, Hashtable

22) Что вы знаете о коллекциях типа List?

List — это упорядоченный список. Объекты хранятся в порядке их добавления в список. Доступ к элементам списка осуществляется по индексу.

23) Что вы знаете о коллекциях типа Set?

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

24) Что вы знаете о коллекциях типа Queue?

Кью - Очередь. Этот список, который используется для реализации концепции FIFO (first in, first out) — «первым пришёл — первым ушёл».
В Queue элементы обычно добавляются в конец.

25) Что вы знаете о коллекциях типа Deque?

.Дек - двунаправленая очередь. Расширяет интерфейс Queue. Обычно используется для реализации концепции LIFO (last in - first out) - "последний пришёл первый вышел" или как Stack.
Но может выступать роли обычной очереди.
Можно добавлять элементы как в начало, так и в конец очереди.

Интерфейс Deque позиционируется как современная альтернатива классу Stack.

Что вы знаете о коллекциях типа Stack?

Стек - это подкласс Vector, который реализует стандартный стек LIFO.
Рекомендуется использовать Deque в место Stack.

26) Почему Map не наследуется от Collection?

Map не наследуется от Collection, потому что это разные структуры данных.

27) Что вы знаете о коллекциях типа HashMap?

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

Как устроен HashMap?(часть 1)

Вычисляется хэш ключа. Если ключ null, хэш считается равным 0. Чтобы достичь лучшего распределения, результат вызова hashCode() «перемешивается»: его старшие биты XOR-ятся на младшие.

Как устроен HashMap?(часть 2)

Значения внутри хэш-таблицы хранятся в специальных структурах данных - нодах, в массиве. Из хэша высчитывается номер бакета - индекс для значения в этом массиве. Полученный хэш обрезается по текущей длине массива. Длина - всегда степень двойки, так что для скорости используется битовая операция &

Как устроен HashMap?(часть 3)

В бакете ищется нода. В ячейке массива лежит не просто одна нода, а связка всех нод, которые туда попали. Исполнение проходит по этой связке (цепочке или дереву), и ищет ноду с таким же ключом. Ключ сравнивается с имеющимися сначала на == (ссылке), затем на equals.

Как устроен HashMap?(часть 4)

Если нода найдена - её значение просто заменяется новым. Работа метода на этом завершается.

Как устроен HashMap?(часть 5)

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

Как устроен HashMap?(часть 6)

В случае, когда структурой была цепочка а не дерево, и длина цепочки превысила 7 элементов - происходит процедура treeification - превращение списка в самобалансирующееся дерево. В случае коллизии это ускоряет доступ к элементам на чтение с O(n) до O(log(n)). У comparable-ключей для балансировки используется их естественный порядок. Другие ключи балансируются по порядку имен их классов и значениям identityHashCode-ов. Для маленьких хэш-таблиц (< 64 бакетов) «одеревенение» заменяется увеличением (см. п.8).

Как устроен HashMap?(часть 7)

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

Как устроен HashMap?(часть 8)

Когда количество занятых бакетов массива превысило пороговое (capacity * load factor), внутренний массив увеличивается вдвое, а для всего содержимого выполняется рехэш - все имеющиеся ноды перераспределяются по бакетам по тем же правилам, но уже с учетом нового размера.

30) Чем отличается метод Put и Get для HashMap?

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

31) Как решается коллизия HashMap?

При совпадении хеш кода, объект сравнивается на равенство ссылок а затем по equals. Если Совпадение найдено то значение у ключа перезаписывается. Если не найдено, то создается новая нода и прикрепляется к структуре существующих нод бакета.

Чем отличается Map от HashMap?

Map это интерфейс, HashMap это реализация этого интерфейса.

Условия перестроения в красно-черное дерево (одеревенение) HashMap?

Как только длина связного списка переходит превышает 7 элементов происходит процедура treeification - превращение списка в самобалансирующееся дерево.
Для маленьких хэш-таблиц (< 64 бакетов) «одеревенение» заменяется увеличением.

32) В чем отличие Map от Set?

Map состоит из пар «ключ-значение». Ключи уникальны, а значения могут повторяться. Порядок элементов не гарантирован. Может иметь 1 null ключ и несколько null значений.

Set состоит из ключей. Которые должны быть уникальны. В HashSet элементы не упорядочены и хранятся в удобном для HashSet порядке (можно сказать случайном). Может хранить 1 null значение.

33) Что вы знаете о коллекциях типа HashSet?

Хеш сет представляет собой таблицу хеш кодов, которая генерируется при добавлении элемента. Элементами хеш сета могут быть только уникальные значения ключа, и одно null значение.

34) Как работает HashSet?

HashSet основан на HashMap, и так же представляет собой массив. HashSet использует хеш таблицы. В начале вычисляется хеш код объекта. На основании хеша и размера массива вычисляется индекс массива. По этому индексу кладется объект. Если происходит коллизия ( эта ячейка не пустая), то в эту же ячейку ложится новый объект и используется односвязный список между ними.

35) Что в HashSet используется вместо значений HashMap?

new Object.

36) Почему в HashSet используется new Object а не null для value значений?

Если не использовать null значение, до при создании и удалении элементов, не будет видно выполнилось действие или нет, т.к. до и после ссылка будет равна null.

37) Что вы знаете о коллекциях типа TreeSet?

TreeSet — коллекция, которая хранит свои элементы вв отсортированном и возрастающем порядке.
TreeSet инкапсулирует в себе TreeMap, который в свою очередь использует сбалансированное бинарное красно-черное дерево для хранения элементов.
TreeSet хорош тем, что для операций add, remove и contains потребуется гарантированное время log(n).

38) Что вы знаете о коллекциях типа TreeMap?

Имплементирует интерфейсы NavigableMap и SortedMap, TreeMap получает дополнительный функционал, которого нет в HashMap, но с меньшей производительностью.

В TreeMap элементы хранятся в естественном(по возрастанию) порядке или согласно компаратору.

В основе лежит Красно-чёрное дерево (Red-Black Tree).

Возможность работы с null-ключом если он разрешен компаратором.

39) Что такое красно-черное дерево?

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

40) Что вы знаете о коллекциях типа LinkedHashSet?

LinkedHashSet наследуется от HashSet. Храненит элементы в порядке добавления.
Имеет двухсвязный список между элементами.

41) Что вы знаете о коллекциях типа LinkedHashMap?

LinkedHashMapнаследуется от HashMap. Храненит элементы в порядке добавления.
Имеет двухсвязный список между элементами.

42) На что указывают крайние ссылки в двухсвязном списке?

на null

43) Что такое двухсвязный и односвязный список?

двухсвязный список - когда элемент имеют ссылку на предыдущий и следующий.
односвязный список - когда элемент имеют ссылку на следующий.

44) Основные реализации List?

ArrayList Список
LinkedList Список
Vector Вектор
Stack Стек

45) Основные реализации Set?

HashSet
TreeSet
LinkedHashSet

46) Основные реализации Map?

HashMap
TreeMap
LinkedHashMap
Hashtable

47) Что вы знаете о коллекциях типа LinkedList?
LinkedList - реализует интерфейс List. Является двунаправленным списком, где каждый элемент структуры содержит указатели на предыдущий и следующий элементы. Итератор поддерживает обход в обе стороны. Реализует методы получения, удаления и вставки в начало, середину и конец списка. Позволяет добавлять любые элементы в том числе и null.
Хранит Элементы в порядке добавления.

48) Какие реализации SortedSet вы знаете и в чем их особенность?

TreeSet - реаализации SortedSet. Реализации этого интерфейса, следит за уникальностью хранимых объектов и поддерживают их в порядке возрастания.
Отношение порядка между объектами может быть определено, помощью метода compareTo интерфейса Comparable, или при помощи специального класса-компаратора, наследующего интерфейс Comparator.

49)В чем отличия/сходства List и Set?

Оба унаследованы от Collection, а значит имеют одинаковый набор и сигнатуры методов. List хранит объекты в порядке вставки, элемент можно получить по индексу.
Set не может хранить одинаковых элементов, доступ по ключу.

49) Что разного/общего у классов ArrayList и LinkedList?

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

50)Когда лучше использовать ArrayList, а когда LinkedList?

Часто указывается что там где нужно добавлять и удалять много элементов из середины нужно использовать LinkedList. А там где нужен доступ по индексу и добавление в конец - ArrayList.
Но по факту лучше стараться почти всегда использовать ArrayList. Т.к в большинстве случаев LinkedList проигрывает по потребляемой памяти и по скорости выполнения операций ArrayList. LinkedList предпочтительно применять, когда происходит активная работа (вставка/удаление) с серединой списка или в случаях, когда необходимо гарантированное время добавления элемента в список.

51) Что будет, если в Map положить два значения с одинаковым ключом?

Последнее значение перезапишет предыдущее.

52) Что такое HashtTable, чем она отличается от HashMap?

HashtTable- deprecated. Не рекомендована к использованию.
Основные отличия HashtTable - синхронизирована и медленнее работает и не позволяет иметь null ключей и значений.

53) Порядок следования в коллекциях?

HashMap/HashSet - "случайный" порядок(удобный для Map/Set) хранения элементов.
ТгееМар/ТгееSet - хранит эл-ты в порядке возрастания элементов.
LinkedHashMap/LinkedHashSet - хранит эл-ты в порядке добавления элементов.

54) Дайте определение понятию "итератор"?

Iterator iterator() это метод интерфейса Collection. Он возвращает итератор — то есть объект, реализующий интерфейс Iterator.
Итератор — объект, позволяющий перебирать элементы коллекции.

55) Методы Iterator?

next();
boolean hasNext();
void remove();

56) Какую функциональность представляет класс Collections?

Collections.sort() - cсортировка
Collections.shuffle() - Перемешивает коллекцию в случайном порядке.
Collections.reverse() - Переворачивает коллекцию в обратном порядке.
Collections.binarySearch() - Поиск в коллекции по ключу с использованием бинарного поиска.
Collections.copy() - Копирует коллекцию источник src в dest.
Collections.frequency() - Возвращает число вхождений объекта в коллекции.
Collections.synchronizedCollection() - Возвращает синхронизированную (потокобезопасную) коллекцию.

57) Какие коллекции синхронизированы?

Для этого используется пакет Concurrent.
@Deprecated HashTable, Vector.

57) Как получить синхронизированную коллекцию из не синхронизированной?

Collections.synchronizedList(list);
Collections.synchronizedSet(set);
Collections.synchronizedMap(map);
Все они принимают коллекцию в качестве параметра, и возвращают потокобезопасную коллекцию с теми же элементами внутри.

58) Как получить коллекцию только для чтения?

Используйте следующие методы:

Collections.unmodifiableList(list);
Collections.unmodifiableSet(set);
Collections.unmodifiableMap(map);
Все они принимают коллекцию в качестве параметра, и возвращают коллекцию только для чтения с теми же элементами внутри.

59) В чем разница между Iterator и Enumeration?

Enumeration в два раза быстрее Iterator и использует меньше памяти. Iterator потокобезопасен, т.к. не позволяет другим потокам модифицировать коллекцию при переборе. Enumeration можно использовать только для read-only коллекций. Так же у него отсутствует метод remove();

60) Разница между Iterator и Iterable?

Iterable - это простое представление серии элементов, которые могут быть итерированы поверх. У него нет никакого состояния итерации такого как "текущий элемент". Вместо этого у него есть один метод, который производит Iterator.
1. Iterator - это объект с состоянием итерации. Он позволяет проверить, есть ли у него больше элементов с помощью hasNext() и переместиться на следующий элемент (если есть) с помощью next(). И метод Remove.

61)Зачем в итераторе метод remove?

Для удаления элемента из коллекции при обходе;
Перед этим необходимо вызвать метод next(). Для того что бы перейти на элемент который нужно удалить.

62) В чем разница между Iterator и ListIterator?

Iterator может использоваться для перебора любых коллеций Set, List и Map. В отличие от него, ListIterator может быть использован только для перебора элементов коллекции List.

Iterator позволяет перебирать элементы только в одном направлении, при помощи метода next(). И удалять методом remove() Тогда как ListIterator позволяет перебирать список в обоих направлениях, при помощи методов next() и previous(), модифицировать список, добавляя/удаляя элементы с помощью методов add() и remove().

63) Какие есть способы перебора всех элементов List?

Iterator, listIterator, for, forEach,While

64) В чём различие между fail-fast и fail-safe итераторами?

Fail-fast итератор генерирует исключение ConcurrentModificationException, если коллекция меняется во время итерации, а fail-safe - нет.

65) Что делать, чтобы не возникло исключение ConcurrentModificationException?

Можно подобрать другой итератор, работающий по принципу fail-safe. К примеру, если вы используете List, то можете взять ListIterator. Если же вам нужна устаревшая коллекция — то используйте перечислители.
В том случае, когда вышеизложенное вам не подходит, у вас есть три варианта:
1. При использовании JDK 1.5 или выше, вам подойдут классы ConcurrentHashMap и CopyOnWriteArrayList. Это самый лучший вариант

2. Вы можете преобразовать список в массив и перебирать массив
3. Вы можете блокировать изменения списка на время перебора с помощью блока synchronized.

Обратите внимание, что последние два варианта негативно скажутся на производительности.

66) Как реализован цикл foreach?

Реализован на основе Iterator.

67) Почему в классе iterator нет метода для получения следующего элемента без передвижения курсора?

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

68) В чем разница между интерфейсами Comparable и Comparator?

Коротко:
Comparable используется для естественной сортировки(по возрастанию).
Comparator для сортировки по разным шаблонам.

Подробно:
Классы-обертки как Integer, Double и String реализуют интерфейс Comparable. По этому метод sort ,без параметров может сортировать эти объекты.
Интерфейс Comparable может быть реализован именно элементами коллекции или ключами Map.
Так же интерфейсом Comparable может пользоваться любой класс который его реализует и переопределяет.

Если у вас нет доступа к классу можно реализовать интерфейс Comparator.

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

69) Почему коллекции не наследуют интерфейсы Cloneable и Serializable?

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

70) Что можно параметризовать?

Параметризовать можно классы, конструкторы, методы, интерфейсы, поля.

71) Параметризация статических переменных и методов?

Нельзя создавать обобщенные статические переменные и методы.
Можно объявлять статические методы со своими параметрами(отличающимися от параметров класса)

72) Ограничения присущие обобщениям?

1. Нельзя создавать экземпляр по параметру типа. Ни обычный объект, ни массив. Тип экземпляра класса должен быть известен заранее.
2. Нельзя создать массив специфических для типа обобщенных ссылок
3. Нельзя создавать обобщенные статические переменные и методы.

73) Почему в статические методы не передается тип класса?

Если статический метод будет привязан к параметрам класса, то может возникнуть такая ситуация, когда экземпляра класса еще не было создан.
Так же и со статическими полями и параметрами класса.

74) Как параметризовать статический метод?

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

75) Что такое ковариантность и контравариантность?

Формально, ковариантность/контравариантность типов - это сохранение/обращение порядка наследования для производных типов. Проще говоря, когда у ковариантных сущностей типами-параметрами являются родитель и наследник, они сами становятся как бы родителем и наследником. Контравариантные наоборот, становятся наследником и родителем.

76) Что такое инвариантность?

Инвариантность - это отсутствие свойств ковариантности и контрвариантности. Дженерики без вайлдкардов инвариантны: List нельзя положить ни в переменную типа List, ни в List.
Массивы ковариантны: в переменную Object[] можно присвоить значение типа String[].

77) Инвариантность еще раз?

Инвариантность — ситуация, когда наследование исходных типов не переносится на производные.
В List нельзя присвоить ничего кроме List не List не List.
Отношение предок-родитель не работает. Это сделано для типобезопасности.

78) Всегда ли Generics инварианты?

Нет. только без использования Wildcards.

79) Что возвращает Comparator и Comparable?

0 если объекты равны.
-1 (отрицательное число) если сравниваемый объект(1 объект) меньше передаваемого(2го объекта)
1 (положительное число) если сравниваемый объект(1 объект) больше передаваемого(2го объекта)

80)Какой метод у Comparator и Comparable?

public int compare(Person a, Person b)
public int compareTo(Person p)

81) Что вернет HashMap если такое значения нет?

Вернет null

82) Какой метод у Iterable?

Интерфейс Iterable содержит один метод iterator(), возвращающий объект типа Itaretor.

Можно ли удалить элемент через remove во время обхода коллекции?

Нет. Можно удалить через Iterator.remove();


написать администратору сайта