"Е, How е вашият процесор?"

"Всичко е наред. Седях в течен азот за един час, така че сега съм като нов!"

"Чудесно. Тогава да продължим."

„Задайте колекции.“

Математически погледнато, наборът е група от уникални елементи. По този начин в програмирането Set е колекция от уникални елементи, т.е. колекция, която не ви позволява да съхранявате идентични елементи.

„Не знам дали Ели ти е показала йерархията на наследяване на Set. Ако не, ето я:“

Реализации на интерфейсите Set и Queue - 1

HashSet е колекция, която съхранява елементи вътрешно, използвайки хеш стойностите, върнати от метода hashCode ().“

„За простота HashSet<E> съхранява обект HashMap<E, Object>, който съхранява стойностите на HashSet като ключове.“

"Уау!"

„Използването на хеш codeове ви позволява бързо да търсите, добавяте и премахвате елементи от набора.“

„Но имайте предвид, че вашият клас трябва правилно да имплементира методите hashCode & equals , за да добавите обекти от вашите класове към Set и да ги намерите правилно там.“

„И двата метода се използват много в HashSet/HashMap.

„Ако забравите да приложите метода hashCode (), рискувате да не можете да намерите вашия обект в Set, дори ако той присъства.“

"Да, спомням си, спомням си. Ти ми каза за това по-рано. Чувал съм всичко за това."

"ОК. Тогава ето още полезна информация за вас."

„Да предположим, че сте внедрor правилно hashCode и equals  във вашия клас и щастливо съхранявате вашите обекти в Set.“

„Но след това отивате и променяте един от обектите и по този начин променяте вътрешните данни, използвани за изчисляване на неговия хеш . Така хешът на обекта се променя.“

"И това означава, че когато го търсите в комплекта, вероятно няма да го намерите."

"Уау! Как става това?"

„Това е добре позната клопка при работа с хешове. По същество търсенето с HashSet (и HashMap) е гарантирано да работи правилно само ако обектите са неизменни .“

"Уау! И Howво, никой не прави нищо по въпроса?"

„Всички се преструват, че проблемът не съществува. Но това често се появява в интервюта, така че може би си струва да си припомним…“

LinkedHashSet е HashSet, чиито елементи също се съхраняват в свързан списък. Нормалните HashSet не поддържат подреждане на елементите. Първо, това просто не е официална операция. Второ, дори вътрешният ред може да се промени значително, когато един е добавен елемент."

Но можете да получите итератор от LinkedHashSet и да го използвате, за да преминете през всички елементи в реда, в който са добавени към LinkedHashSet . Не се случва често, но понякога това е много необходимо."

„Разбирам. Обичам, когато има класове за тези сценарии „за всеки случай“. Такива случаи не са толкова редки.“

" TreeSet е колекция, която съхранява елементи под формата на дърво, подредено по стойности. TreeSet <E> съдържа TreeMap <E, Object>, което съхранява всички тези стойности. И това TreeMap използва балансирано червено - черно дърво за съхранение елементи . В резултат на това той поддържа много бързо добавяне, премахване и съдържа операции."

"Да, спомням си. Обсъждахме това съвсем наскоро. И аз също се замислих къде се използва това."

„И се оказва, че някои от най-популярните колекции на Java го използват.“

„Да. Между другото, интервюиращите често питат за TreeSet . Те обикновено се опитват да ви измамят. Те ще кажат, „ако TreeSet използва двоично дърво, тогава всички елементи могат да образуват един дълъг клон, така че търсенията ще отнемат дълго време. «Това е моментът да поставим нахалния човек на мястото му, като заявим: „Дори дете знае, че TreeSet и TreeMap използват балансирани червено-черни дървета , така че тази ситуация всъщност е невъзможна.»“

„Ах. Бих се радвал да видя лицето на човека, който зададе този въпрос. Може дори да запомня тази фраза...“

„Но на практика Set се оказа не толкова прост, колкото си мислех първоначално.“

„От друга страна, ситуацията с Queue е много по-проста:“

Реализации на интерфейсите Set и Queue - 2

" Queue имплементира опашка. Елементите се добавят в края на опашката и се вземат отпред."

" PriorityQueue всъщност е единственото класическо изпълнение на интерфейса Queue , без да броим LinkedList , което технически също е опашка."

„Добре, изморявам се. Това е всичко за днес. До следващия път.“