JavaRush /Java Blog /Random-TL /Ano ang maaari nilang itanong sa isang panayam: Mga istru...

Ano ang maaari nilang itanong sa isang panayam: Mga istruktura ng data sa Java. Bahagi 1

Nai-publish sa grupo
Kamusta! Gaano man ang pagtingin mo dito, hindi ka maaaring maging isang developer nang hindi matagumpay na pumasa sa isang teknikal na panayam sa pagpasok. What могут спросить на собеседовании: структуры данных в Java - 1Mayroong maraming mga teknolohiya na nauugnay sa Java, at imposibleng matutunan ang lahat. Bilang panuntunan, may partikular na itinatanong sa panahon ng mga panayam kung naghahanap sila ng developer na may magandang karanasan sa ilang balangkas na mahalaga para sa proyekto. Kung ito ay gayon, ikaw ay hahabulin sa paligid ng balangkas na ito sa buong bilis, wala kang pagdududa tungkol dito. What могут спросить на собеседовании: структуры данных в Java - 2Ngunit ngayon ay pinag-uusapan natin ang base na dapat malaman ng bawat developer ng Java. Tungkol sa klasikal na kaalaman kung saan nagsisimula ang lahat. Ngayon gusto kong hawakan ang isa sa mga pangunahing paksa ng anumang mga istruktura ng panayam-data sa Java . Kaya, sa halip na matalo sa paligid ng bush, magsimula tayo. Maghanap ng isang listahan ng mga tanong na maaaring itanong sa iyo tungkol sa paksang ito sa panahon ng isang pakikipanayam.

1. Sabihin sa amin ang kaunti tungkol sa mga istruktura ng data

Ang istraktura ng data ay isang data store na naglalaman ng impormasyong nakabalangkas sa isang tiyak na paraan. Ang mga istrukturang ito ay dinisenyo para sa mahusay na pagganap ng ilang mga operasyon. Ang mga karaniwang halimbawa ng mga istruktura ng data ay:
  • arrays,
  • mga stack,
  • mga pila,
  • mga kaugnay na listahan,
  • mga graph,
  • mga puno,
  • mga puno ng prefix,
  • hash table.
Maaari mong malaman ang higit pa tungkol sa kanila dito at dito . Ang data ay isang mahalagang bahagi sa isang programa, at pinapayagan ng mga istruktura ang data na ito na maimbak sa isang partikular, malinaw na nakabalangkas na anyo. Anuman ang gawin ng iyong application, ang aspetong ito ay palaging naroroon dito: kung ito ay isang web store, kung gayon ang impormasyon tungkol sa mga produkto ay maiimbak, kung ito ay isang social network, data tungkol sa mga user at mga file, at iba pa.

2. Ano ang alam mo tungkol sa Arrays?

Ang array ay isang lalagyan para sa pag-iimbak ng mga halaga ng parehong uri, ang bilang nito ay tinukoy nang maaga. Isang halimbawa ng paglikha ng isang array na may mga halaga ng string:
String[] strArray = {"Java","is","the","best","language"};
Kapag lumilikha ng isang array, ang memorya ay inilalaan para sa lahat ng mga elemento nito: mas maraming mga cell para sa mga elemento ang unang tinukoy, mas maraming memorya ang ilalaan. Kung ang isang walang laman na array na may isang tiyak na bilang ng mga cell ay nilikha, ang lahat ng mga elemento ng array ay itatalaga ng mga default na halaga. Halimbawa:
int[] arr = new int[10];
Так, для массива с elementми типа boolean начальные (default) значения будут равны false, для массивов с числовыми значениями — 0, с elementми типа char\u0000. Для массива типа класса (an objectы) — null (не пустые строки — “” а именно null). То есть, в примере выше все значения массива arr будут равны 0 до тех пор, пока они не будут непосредственно заданы. В отличие от коллекций, массивы не являются динамическими. После объявления массива определенного размера сам размер нельзя изменить. Whatбы добавить новый элемент в массив, необходимо создать новый массив большего размера и скопировать в него все элементы со старого (это принцип работы ArrayList). Есть один момент, который знают не все и на котором вас могут неплохо подловить. В Java есть два вида переменных — простые типы и ссылки на полноценные an objectы. К Howому из них относятся массивы? Например, вот:
int[] arr = new int[10];
Вроде бы все просто — это 10 элементов int. Получается, можно сказать, что это простой тип? Как бы не так. В Java массивы являются an objectми, динамически создаются и могут быть назначены переменным типа Object. Все методы класса Object можно вызвать в массиве. Поэтому мы можем даже написать:
Object arr = new int[]{7,5,4,3};
System.out.println(arr.toString());
При выводе в консоли можно получить что-то вроде:
[I@4769b07b
Подробнее об особенностях массивов в Java рассказывается в этой статье o Java Array. Whatбы закрепить знания, можно решить несколько задач из этой подборки.

3. Расскажите об иерархии коллекций

Коллекции используются в ситуациях, когда нужна гибкость при работе с данными. Коллекции могут добавлять элемент, удалять элемент и выполнять множество других операций. В Java есть множество различных реализаций, а нам нужно всего лишь выбрать правильную коллекцию для текущей ситуации. Как правило, когда вы упоминаете интерфейс Collection, вас просят перечислить некоторые его реализации и отношение с Map. What ж, давайте разбираться. Итак, Collection и Map — это две разные иерархии для структур данных. Как выглядит иерархия Collection:What могут спросить на собеседовании: структуры данных в Java - 3Интерфейс Collection является ключевым верховным звеном с перечнем базовых методов, от которого и берут начало три базовых вида структур данных — Set, List, Queue. Set<T> — интерфейс, представляющий собой совокупность an objectов, в которой каждый an object является уникальным. List<T> — интерфейс, представляющий упорядоченную последовательность an objectов, которая называется списком. Queue<T> — интерфейс, отвечающий за структуры, которые организованы в виде очереди (последовательное хранение элементов). Как говорилось раньше, Map является отдельной иерархией:What могут спросить на собеседовании: структуры данных в Java - 4Map<K, V> — интерфейс, представляющий словарь, в котором элементы содержатся в виде пар "ключ-meaning". При этом все ключи (K) уникальные в пределах an object Map. Данный вид коллекции облегчает поиск element, если нам известен ключ — уникальный идентификатор an object.

4. What вы знаете о Set?

Как говорилось ранее, данная коллекция представляет множество уникальных элементов. Иначе говоря, один и тот же an object не может встречаться в Java Set более одного раза. Также хотелось бы обозначить, что из Set мы не можем вытащить элемент по номеру (индексу) — только перебором. Важно то, что разные реализации Set имеют разный способ структуризации данных. Конкретные реализации мы и рассмотрим далее. Итак, основные реализации Set: HashSet — множество, которое основано на хеш-таблице, что в свою очередь помогает при поиске. Использует хеш-функцию, которая улучшает производительно при поиске и вставке. Независимо от количества элементов, в основном, вставка и поиск (иногда и удаление) выполняются за время, близкое к постоянному — O(1). Подробнее с хеш-функцией мы ознакомимся чуть позже. Также хотелось бы отметить, что HashSet содержит в себе HashMap, в котором и происходит вся магия. Вот подробная статья о HashSet в Java. LinkedHashSet — данный класс расширяет HashSet, при этом не добавляя ниHowих новых методов. Как и LinkedList, данный класс поддерживает связный список элементов набора в том порядке, в котором они вставлялись. Это позволяет организовать необходимый порядок в данной реализации Set. Класс TreeSet создает множество, которое для организации структуры хранения элементов основано на красно-черном дереве. Другими словами, в данном множестве мы можем сортировать элементы в возрастающем порядке. Если мы используем некоторые стандартные an objectы из “коробки”, например, Integer, то для выстраивания множества Integer в возрастающем порядке нам ничего и не нужно делать:
TreeSet set = new TreeSet<>();
set.add(4);
set.add(2);
set.add(3);
set.add(1);

System.out.println(set);
И в консоли мы получим вывод:
[1, 2, 3, 4]
То есть, в данном set числа хранятся в отсортированном виде. Если мы будем использовать элементы String в TreeSet, они будут отсортированы, но по алфавиту. Ну а что если у нас есть некоторый стандартный (пользовательский) класс? Каким образом an objectы данного класса будет структуризировать TreeSet? Если мы попробуем задать произвольный an object в данный Set:
TreeSet set = new TreeSet<>();
set.add(new Cat(4, "Murzik"));
set.add(new Cat(2, "Barsik"));
set.add(new Cat(3, "Гарфилд"));

System.out.println(set);
Мы получим ClassCastException, так How TreeSet не знает, How сортировать an objectы данного типа. В таком случае нужно, чтобы наш кастомный an object реализовал интерфейс Comparable, и его метод compareTo:
public class Cat implements Comparable {
    int age;
    String name;

   public Cat(int age, String name) {
       this.age = age;
       this.name = name;
   }

   @Override
   public int compareTo(Cat cat) {
       return age > cat.age ? 1 : -1;
   }

   @Override
   public String toString() {
       return "Cat{" +
               "age=" + age +
               ", name='" + name + '\'' +
               '}';
   }
}
Как вы заметor, метод compareTo возвращает int:
  • 1, если текущий (this) an object считается большим;
  • -1, если текущий an object считается меньшим, чем тот, который пришел аргументом;
  • 0, если an objectы равны (в данном случае мы это не используем).
В таком случае наш TreeSet отработает корректно и выведет результат:
[Cat{age=2, name='Барсик'}, Cat{age=3, name='Гарфилд'}, Cat{age=4, name='Мурзик'}]
Другой способ — создание отдельного класса, ответственного за сортировку, который реализует интерфейс comparator и его метод compare:
public class CatComparator implements Comparator {

   @Override
   public int compare(Cat o1, Cat o2) {
       return o1.age > o2.age ? 1 : -1;
   }
}
В таком случае для его использования мы должны задать an object данного класса в конструктор TreeSet:
TreeSet set = new TreeSet<>(new CatComparator());
После этого все an objectы класса Cat, попавшие в TreeSet, будут отсортированы с помощью класса Cat Comparator. Больше о Comparator и Comparable в Java можно узнать из этой статьи.

5. Расскажите о Queue

Queue — интерфейс, отвечающий за структуры, которые организованы в виде очереди — структуры данных, которая хранит элементы последовательно. Например, из очереди людей первым зайдет человек, пришедший раньше других, последним — тот, кто пришел позже всех. Этот способ называется — FIFO, то есть First in First Out. Уникальные методы Queue направлены на работу с первым or последним элементом, например:
  • add и offer — вставляет элемент в конец очереди,
  • remove — извлекает и удаляет заголовок этой очереди,
  • peek — извлекает, но не удаляет заголовок очереди.
ЧАСТЬ 2
Mga komento
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION