JavaRush /Java Blog /Random-ID /Level 26. Jawaban pertanyaan wawancara pada topik level. ...
zor07
Level 31
Санкт-Петербург

Level 26. Jawaban pertanyaan wawancara pada topik level. Bagian 1. Pertanyaan 1-5, 10.

Dipublikasikan di grup Random-ID
Level 26. Jawaban pertanyaan wawancara pada topik level.  Bagian 1. Soal 1-5, 10. - 1Ringkasannya ternyata cukup rumit, jadi saya membaginya menjadi dua bagian. Bagian kedua berisi jawaban atas pertanyaan mengenai kankarency dan multithreading. Bagian pertama berisi sisanya. Menulis itu cukup sulit. Saya masih kurang mengerti, jadi seperti biasa, komentar, komentar, tambahan dipersilakan)

1. Bagaimana cara menggunakan antarmuka Sebanding?

Antarmuka Comparablehanya mendeklarasikan satu metode compareTo(Object obj), yang dirancang untuk mengimplementasikan pengurutan objek kelas. Lebih mudah digunakan saat mengurutkan daftar atau array objek. Metode ini membandingkan objek yang dipanggil dengan keberatan. Berbeda dengan metode equalsyang mengembalikan true atau false , compareTomengembalikan:
  • 0 jika nilainya sama;
  • Nilai negatif jika callee lebih kecil dari parameter;
  • Positif jika callee lebih besar dari parameter.
Hal ini terutama berguna untuk mengurutkan daftar terurut ( java.util.List) dan array objek. Jika daftar/array berisi elemen yang mengimplementasikan antarmuka ini, maka elemen tersebut dapat diurutkan secara otomatis berdasarkan java.util.Collections.sort(List)/Arrays.sort(Object[]). Konsep pengurutan alami dikaitkan dengan antarmuka Comparable, karena ia menetapkan tatanan alami untuk instance kelas mana pun yang mengimplementasikan antarmuka ini. Dengan kata lain, orde (x, y) sesuai dengan terpenuhinya kondisi x.compareTo(y) <= 0. Aturan implementasinya Comparable, atau lebih tepatnya, metodenya, compareTo(Object)adalah sebagai berikut (x dan y adalah instance dari kelas yang mengimplementasikannya Comparable):
  • x.compareTo(y)mengembalikan -1 atau 1 jika x masing-masing harus sebelum atau sesudah y. Jika metode mengembalikan 0, maka orde (x, y) dan (y, x) ekuivalen.
  • Jika sign(a)suatu fungsi yang mengembalikan -1,0,1 untuk a, berturut-turut, kurang dari 0, sama dengan 0 dan lebih besar dari 0, maka persamaan harus dipenuhi sign(x.compareTo(y))==-sign(y.compareTo(x)). Logikanya: jika x muncul sebelum y, maka y harus muncul setelah x, dan sebaliknya.
  • Jika x.compareTo(y) > 0dan y.compareTo(z) > 0, maka x.compareTo(z) > 0– hubungan transitivitas ketidaksetaraan.
  • Jika x.compareTo(y) == 0, maka sign(x.compare(z)) == sign(y.compareTo(z)), untuk sembarang z.
  • Panggilan tersebut x.compareTo(null)harus memunculkan pengecualian NullPointerException. Ini adalah perbedaan dengan logika implementasi equals(izinkan saya mengingatkan Anda, x.equals(null)ini mengembalikan false ).
  • Jika tipe y tidak dapat dibandingkan dengan x, maka panggilan tersebut x.compareTo(y)harus mengeluarkan pengecualian ClassCastException.
  • (x.compareTo(y) == 0) == x.equals(y), yaitu. panggilan x.compareTo(y)harus mengembalikan 0 jika dan hanya jika x.equals(y)panggilan tersebut mengembalikan true . Ini adalah aturan konsistensi dan sangat penting untuk dipertimbangkan.
Sumber:

2. Bagaimana cara menggunakan antarmuka Komparator?

В интерфейсе 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
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION