JavaRush /مدونة جافا /Random-AR /المستوى 26. إجابات لأسئلة المقابلة حول موضوع المستوى. الج...
zor07
مستوى
Санкт-Петербург

المستوى 26. إجابات لأسئلة المقابلة حول موضوع المستوى. الجزء 1. الأسئلة 1-5، 10.

نشرت في المجموعة
المستوى 26. إجابات لأسئلة المقابلة حول موضوع المستوى.  الجزء 1. الأسئلة 1-5، 10. - 1تبين أن الملخص مرهق للغاية، لذلك قمت بتقسيمه إلى قسمين. يحتوي الجزء الثاني على إجابات للأسئلة المتعلقة بالكانكارنسي وتعدد مؤشرات الترابط. الجزء الأول يحتوي على الباقي. كانت الكتابة صعبة للغاية. ما زلت لا أفهم الكثير، لذا كما هو الحال دائمًا، نرحب بالتعليقات والتعليقات والإضافات)

1. كيفية استخدام الواجهة القابلة للمقارنة؟

تعلن الواجهة Comparableعن طريقة واحدة فقط compareTo(Object obj)، مصممة لتنفيذ ترتيب كائنات الفئة. إنه مناسب للاستخدام عند فرز القوائم أو صفائف الكائنات المرتبة. تقارن هذه الطريقة الكائن المستدعى به obj. على النقيض من الطريقة equals، التي تُرجع صحيحًا أو خطأً ، compareToتُرجع:
  • 0 إذا كانت القيم متساوية؛
  • قيمة سالبة إذا كان المستدعى أقل من المعلمة؛
  • موجب إذا كان المستدعى أكبر من المعلمة.
إنه مفيد بشكل أساسي لفرز القوائم المرتبة ( java.util.List) ومصفوفات الكائنات. إذا كانت القائمة/المصفوفة تحتوي على عناصر تنفذ هذه الواجهة، فيمكن فرزها تلقائيًا حسب الملف java.util.Collections.sort(List)/Arrays.sort(Object[]). يرتبط مفهوم الترتيب الطبيعي بالواجهة Comparable، لأنه ينشئ ترتيبًا طبيعيًا لمثيلات أي فئة تنفذ هذه الواجهة. بمعنى آخر، الترتيب (x، y) يتوافق مع تحقيق الشرط x.compareTo(y) <= 0. قواعد التنفيذ Comparable، أو بالأحرى طريقته، compareTo(Object)هي كما يلي (x و y هما مثيلان للفئة التي تنفذ Comparable):
  • x.compareTo(y)تُرجع -1 أو 1 إذا كان x يجب أن يكون قبل أو بعد y، على التوالي. إذا أعادت الطريقة 0، فإن الترتيبين (x، y) و (y، x) متكافئان.
  • إذا sign(a)كانت دالة تُرجع -1,0,1 لـ a، على التوالي، أقل من 0، وتساوي 0 وأكبر من 0، فيجب استيفاء المساواة sign(x.compareTo(y))==-sign(y.compareTo(x)). وهذا أمر منطقي: إذا كان x يأتي قبل y، فيجب أن يأتي y بعد x، والعكس صحيح.
  • إذا x.compareTo(y) > 0و y.compareTo(z) > 0، إذن x.compareTo(z) > 0– علاقة تعدية عدم المساواة.
  • إذا x.compareTo(y) == 0، إذن sign(x.compare(z)) == sign(y.compareTo(z))، لأي ض.
  • يجب أن يطرح الاستدعاء x.compareTo(null)استثناءً NullPointerException. هذا تناقض مع منطق التنفيذ equals(دعني أذكرك x.equals(null)أنه يُرجع false ).
  • إذا كان لا يمكن مقارنة نوع y بـ x، فيجب أن يطرح الاستدعاء x.compareTo(y)استثناءً ClassCastException.
  • (x.compareTo(y) == 0) == x.equals(y)، أي. يجب أن يرجع الاستدعاء x.compareTo(y)0 إذا وفقط إذا x.equals(y)عاد صحيحًا . هذه قاعدة اتساق ومن المهم جدًا أخذها في الاعتبار.
مصادر:

2. كيفية استخدام واجهة المقارنة؟

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