JavaRush /Blog Java /Random-FR /Niveau 26. Réponses aux questions d'entretien sur le suje...
zor07
Niveau 31
Санкт-Петербург

Niveau 26. Réponses aux questions d'entretien sur le sujet du niveau. Partie 1. Questions 1-5, 10.

Publié dans le groupe Random-FR
Niveau 26. Réponses aux questions d'entretien sur le sujet du niveau.  Partie 1. Questions 1-5, 10. - 1Le résumé s'est avéré assez lourd, je l'ai donc divisé en deux parties. La deuxième partie contient des réponses aux questions concernant la kankarence et le multithreading. La première partie contient le reste. L'écriture était assez difficile. Je ne comprends toujours pas grand chose, donc comme toujours, commentaires, remarques, ajouts sont les bienvenus)

1. Comment utiliser l’interface Comparable ?

L'interface Comparabledéclare une seule méthode compareTo(Object obj), conçue pour implémenter l'ordre des objets de classe. Il est pratique à utiliser lors du tri de listes ordonnées ou de tableaux d’objets. Cette méthode compare l'objet appelé avec obj. Contrairement à la méthode equals, qui renvoie true ou false , compareTorenvoie :
  • 0 si les valeurs sont égales ;
  • Une valeur négative si l'appelé est inférieur au paramètre ;
  • Positif si l'appelé est supérieur au paramètre.
Il est principalement utile pour trier des listes ordonnées ( java.util.List) et des tableaux d'objets. Si la liste/le tableau contient des éléments qui implémentent cette interface, ils peuvent alors être triés automatiquement par le java.util.Collections.sort(List)/Arrays.sort(Object[]). Le concept d'ordre naturel est associé à une interface Comparable, car il établit un ordre naturel pour les instances de toute classe qui implémente cette interface. Autrement dit, l'ordre (x, y) correspond à la réalisation de la condition x.compareTo(y) <= 0. Les règles d'implémentation Comparable, ou plutôt sa méthode, compareTo(Object)sont les suivantes (x et y sont des instances de la classe qui implémente Comparable) :
  • x.compareTo(y)renvoie -1 ou 1 si x doit être avant ou après y, respectivement. Si la méthode renvoie 0, alors les ordres (x, y) et (y, x) sont équivalents.
  • Si sign(a)c'est une fonction qui renvoie -1,0,1 pour a, respectivement inférieur à 0, égal à 0 et supérieur à 0, alors l'égalité doit être satisfaite sign(x.compareTo(y))==-sign(y.compareTo(x)). Ce qui est logique : si x vient avant y, alors y doit venir après x, et vice versa.
  • Si x.compareTo(y) > 0et y.compareTo(z) > 0, alors x.compareTo(z) > 0– la relation de transitivité des inégalités.
  • Si x.compareTo(y) == 0, alors sign(x.compare(z)) == sign(y.compareTo(z)), pour tout z.
  • L'appel x.compareTo(null)doit lever une exception NullPointerException. Il s'agit d'une divergence avec la logique d'implémentation equals(je vous rappelle x.equals(null)qu'elle renvoie false ).
  • Si le type de y ne peut pas être comparé à x, alors l'appel x.compareTo(y)doit lever une exception ClassCastException.
  • (x.compareTo(y) == 0) == x.equals(y), c'est à dire. l'appel x.compareTo(y)doit renvoyer 0 si et seulement s'il x.equals(y)renvoie true . C’est une règle de cohérence et il est très important de la prendre en compte.
Sources:

2. Comment utiliser l'interface du Comparateur ?

В интерфейсе Comparator объявлено два метода compare(Object obj1, Object obj2) и equals(Object obj). При использовании интерфейса Comparator, логика сравнения пары an objectов не прячется внутрь класса/an object, а реализуется в отдельном классе. Метод compare(x,y) в точности соответствует по своей сути вызову x.compareTo(y). Точно так же должны выполняться все правила, что и правила для реализации метода compareTo(Object) интерфейса Comparable. Comparator может использоваться в любом месте, где нужна sorting. При этом, во-первых, появляется необходимая гибкость – возможность реализации нескольких правил сортировки. А во-вторых, сортируемые an objectы могут не реализовывать интерфейс Comparable. В случае, если они его все-таки реализуют, Comparator имеет приоритет. Интерфейс Comparator определяет еще и метод equals(Object), How это ни парадоксально. Этот метод служит для сравнения самих экземпляров интерфейса Comparator и должен возвращать true только в том случае, если сравниваемые an objectы обеспечивают одинаковый порядок сортировки. Однако всегда безопасно оставлять исходную реализацию Object.equals(Object) нетронутой Источник:

3. Какие методы есть у класса Collections?

public static <T> boolean addAll(Collection<? super T> c, T... elements) Метод добавляет элементы массива elements в коллекцию Collection<? super T> c. Элементы могут быть указаны по одиночке, либо How массив. Когда элементы указанны по отдельности данный метод предоставляет возможность удобно добавить все элементы в имеющуюся коллекцию: Collections.addAll(flavors, "Peaches 'n Plutonium", "Rocky Racoon"); public static <T> int binarySearch(List<? extends Comparable<? super T>> list, T key) public static <T> int binarySearch(List<? extends T> list, T key, Comparator<? super T> c) Оба метода ищут в списке переданном в параметре an object переданный в параметре используя алгоритм двоичного поиска. Возвращают индекс element, если такой элемент в списке есть, иначе индекс первого element списка большего key, если все элементы меньше key, возвращает list.size(). Перед использованием данных методов списки должны быть отсортированы. В первом случае отсортированы по возрастанию в "естественном" порядке следования элементов списка (такой же, How при использовании Collections.sort(list)). Во втором случае список должен быть отсортирован по возрастанию в порядке следования, который обеспечивает переданный компаратор (такой же порядок, How при использовании Collections.sort(list, c)[здесь "с" - компаратор из параметров описываемого метода]) public static <E> Collection<E> checkedCollection(Collection<E> c, Class<E> type) Преамбула: механизм дженериков в языке обеспечивает проверку типов во время компиляции. Обычно этого и достаточно, однако бывают случаи, когда все-таки нет. К примеру мы нашу коллекцию передаем в code библиотеки, куда-нибудь на сторону, нам неизвестную, и нам очень сильно хочется, чтоб code этой "third-party library" не вставил в нашу коллекцию элемент неправильного типа. Это вот возможная проблема номер 1. Возможная проблема номер 2 следующая. Предположим наша программа выдает нам ClassCastException , который оповещает нас о том, что в коллекцию был вставлен элемент неправильного типа. К сожалению данное исключение может вылететь в любой момент, после того, How неправильный элемент был вставлен, и обычно предоставляет нам совсем немного or вообще ноль информации об источнике проблемы. Используя метод метод checkedCollection мы можем избавить себя от проблемы один и два, т.к. этот метод создает коллекцию проверяемую на этапе выполнения. Решение проблемы номер два, с помощью данного метода: К примеру мы имеем вот это, и у нас вываливается ClassCastException.
Collection<String> c = new HashSet<String>();
Код выше можно временно заменить на:
Collection<String> c = Collections.checkedCollection(
         new HashSet<String>(), String.class);
При запуске программы снова мы локализуем строку codeа, которая вставляет элемент неправильного типа в нашу коллекцию. Родственные на мой взгляд методы: public static <E> List<E> checkedList(List<E> list,Class<E> type) public static <K,V> Map<K,V> checkedMap(Map<K,V> m, Class<K> keyType,Class<V> valueType) public static <E> Set<E> checkedSet(Set<E> s,Class<E> type) public static <K,V> SortedMap<K,V> checkedSortedMap(SortedMap<K,V> m,Class<K> keyType,Class<V> valueType) public static <E> SortedSet<E> checkedSortedSet(SortedSet<E> s,Class<E> type) public static <T> void copy(List<? super T> dest,List<? extends T> src) Метод копирует элементы src в dest. индексы у копированных элементов будут совпадать. public static <T extends Object & Comparable<? super T>> T min(Collection<? extends T> coll) public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll) public static <T> T min(Collection<? extends T> coll,Comparator<? super T> comp) public static <T> T max(Collection<? extends T> coll,Comparator<? super T> comp) методы возвращают минимальный\максимальный элемент в коллекции с точки зрения "естественного порядка"(интерфейс Comparable) либо порядка переданного компаратора. public static boolean disjoint(Collection<?> c1,Collection<?> c2) returns true если у коллекций нет одинаковых элементов. <T> List <T> emptyList(), <K,V> Map <K,V> emptyMap(), <T> Set <T> emptySet() – возвращают пустой список, карту отображения и множество соответственно; <T> void fill(List<? super T> list, T obj) – заполняет список заданным элементом ; int frequency(Collection<?> c, Object o) – возвращает количество вхождений в коллекцию заданного element; <T> List <T> nCopies(int n, T o) – возвращает список из n заданных элементов; <T> boolean replaceAll(List<T> list, T oldVal, T newVal) – заменяет все заданные элементы новыми; void reverse(List<?> list) – “переворачивает” список; void rotate(List<?> list, int distance) – сдвигает список циклически на заданное число элементов; void shuffle(List<?> list) – перетасовывает элементы списка; <T> Set <T> singleton(T o), singletonList(T o), singletonMap(K key, V value) – создают множество, список и карту отображения, состоящие из одного element; <T extends Comparable<? super T>> void sort(List<T> list), <T> void sort(List<T> list, Comparator<? super T> c) – sorting списка, естественным порядком и используя Comparator соответственно; void swap(List<?> list, int i, int j) – меняет местами элементы списка стоящие на заданных позициях. Источники:

4. Какие методы есть у класса Arrays?

Полный перечень методов класса Arrays можно увидеть в documentации. В данном конспекте приведу лишь некоторые из них. [переводил методы из documentации, и к сожалению потерял большую часть своего перевода. Обидно, и тратить время на тоже самое не хочется, так что вставлю нагугленное] public static <T> List<T> asList(T... a) формирует список на основе массива. Массив при этом используется для внутреннего представления списка. Таким образом сохраняется связь между списком и исходным массивом: изменения в массиве отразятся на списке:
String[] a = { "foo", "bar", "baz"};
List<String> list = Arrays.asList(a);
System.out.println(list); // [foo, bar, baz]

a[0] = "aaa";
System.out.println(list); // [aaa, bar, baz]
изменения в списке отразятся на массиве:
String[] a = { "foo", "bar", "baz"};
List<String> list = Arrays.asList(a);
System.out.println(list); // [foo, bar, baz]

list.set(0, "bbb");
System.out.println(Arrays.toString(a)); // [bbb, bar, baz]
Если массив содержит an objectы, очевидно, и массив и список будут ссылаться на одни и те же экземпляры:
Object[] a = { new Object(), new Object(), new Object()};
List<Object> list = Arrays.asList(a);
System.out.println(a[0] == list.get(0)); // true
int binarySearch(параметры) – перегруженный метод организации бинарного поиска значения в массивах примитивных и an objectных типов. returns позицию первого совпадения; void fill(параметры) – перегруженный метод для заполнения массивов значениями различных типов и примитивами; void sort(параметры) – перегруженный метод сортировки массива or его части с использованием интерфейса Comparator и без него; static <T> T[] copyOf(T[] original, int newLength) –заполняет массив определенной длины, отбрасывая элементы or заполняя null при необходимости; static <T> T[] copyOfRange(T[] original, int from, int to) – копирует заданную область массива в новый массив; <T> List<T> asList(T… a) – метод, копирующий элементы массива в an object типа List<T>. Источник:

5. Как называется sorting, которая используется при вызове Collections.sort()?

Из documentации: Реализация является адаптированным вариантом сортировки списка для Python Тима Петерса (TimSort). Данная реализация сбрасывает список в массив, сортирует массив, затем проходит по списку и перезагружает каждый элемент списка из соответствующего element массива. Это позволяет избежать сложности n*n log(n), которая возникла бы при попытки отсортировать связный список напрямую Из вики: Timsort — гибридный алгоритм сортировки, сочетающий сортировку вставками и сортировку слиянием, опубликованный в 2002 году Тимом Петерсом. В настоящее время Timsort является стандартным алгоритмом сортировки в Python, OpenJDK 7 и реализован в Android JDK 1.5. Основная идея алгоритма в том, что в реальном мире сортируемые массивы данных часто содержат в себе упорядоченные подмассивы. На таких данных Timsort существенно быстрее многих алгоритмов сортировки.

10. What такое итератор?

Представленный в релизе JDK 1.2 языка Java интерфейс java.util.Iterator обеспечивает итерацию контейнерных классов. Каждый Iterator реализует методы next() и hasNext() и дополнительно может поддерживать метод remove(). Итераторы создаются соответствующими контейнерными классами, How правило методом iterator(). Метод next() переводит итератор на следующее meaning и возвращает указываемое meaning итератору. При первоначальном создании итератор указывает на специальное meaning, находящееся перед первым элементом, поэтому первый элемент можно получить только после первого вызова next(). Для определения момента, когда все элементы в контейнере были перебраны, используется тестовый метод hasNext(). Следующий пример демонстрирует простое использование итераторов:
Iterator iter = list.iterator();
//Iterator<MyType> iter = list.iterator(); в J2SE 5.0
while (iter.hasNext())
    System.out.println(iter.next());
Для коллекции типов, поддерживающей подобное, метод итератора remove() удаляет последний 'посещенный' элемент из контейнера. Почти все остальные типы модификации контейнера во время итерации являются небезопасными. Кроме того, для java.util.List существует java.util.ListIterator со схожим API, но позволяющем прямую и обратную итерации, обеспечивая определение текущего индекса в списке и переход к элементу по его позиции. Источник: Часть 2
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION