Интерфейс SET в Java имеет следующие характеристики:
Повторные элементы не допускаются;
Элементы в наборе не в порядке;
Есть и только один элемент со значением нуля.
Поскольку интерфейс SET в Java имитирует математическую абстракцию, соответствующие характеристики математического набора являются:
Взаимный противоположный пол: в наборе любые два элемента считаются разными, то есть каждый элемент может появляться только один раз.
Расстройство: в наборе каждый элемент имеет одинаковый статус и расстройство между элементами. Последовательные отношения могут быть определены на наборе. После определения отношений порядка элементы могут быть отсортированы в соответствии с порядок отношений. Но с точки зрения характеристик самого набора, между элементами нет необходимого порядка.
Природа пустого набора: пустой набор - это подмножество всех наборов
Установка не сохраняет дубликаты элементов. Наиболее часто используемым набором являются тестовые атрибуты, вы можете легко спросить, находится ли объект в наборе. SET имеет точно такой же интерфейс, что и коллекция, поэтому нет дополнительной функциональности. На самом деле, набор - это коллекция, но поведение отличается.
Основными вещами, которые реализуют интерфейс SET, являются хэшсет, деревья и LinkedHashset, которые являются общими точками каждого и того же элемента, сохраняются только одну копию. У них также есть различия, различия следующие:
1. Hashset:
Hashset использует очень сложный способ хранения элементов. Использование хешса может получить элементы в коллекции как можно быстрее, что очень эффективно (для пространства для торговли). Будет ли пангдуан, будет определяться тем же объектом на основе хэшкода и равных. Если хешкод одинаково и равно возвращает TRUE, это тот же объект и не может быть сохранен неоднократно.
пакет cn.set; import java.util.hashset; import java.util.set; класс Студент {int id; Public Student (int id) {this.id = id; } @Override public String toString () {return this.id+""; } @Override public int hashcode () {return this.id; } @Override public boolean equals (Object obj) {if (obj InstactOf студента) {Студент Stu = (студент) OBJ; if (stu.id == this.id) вернуть true; } вернуть false; }} открытый класс hashsettest {public static void main (string [] args) {set <tood> set = new Hashset <Tood> (); Студент S1 = новый студент (1); Студент S2 = новый студент (1); Студент S3 = новый студент (2); set.add (s1); set.add (s2); set.add (s3); для (Студент S: SET) {System.out.println (s); }}}Как показано в приведенном выше примере, после переписывания методов HashCode () и Equals () для различения объектов согласия не могут быть сохранены. Если эти два метода аннотированы, все объекты студентов считаются разными объектами и могут храниться.
2.treeset
Treesset не может хранить дублируемые объекты, но Treesset будет автоматически сортироваться. Если сохраненные объекты не могут быть отсортированы, сообщается об ошибке, поэтому хранимые объекты должны указывать правила сортировки. Правила сортировки включают в себя естественную сортировку и сортировку клиентов.
① Естественная сортировка: объект для добавления TreesSet будет реализовать интерфейс java.lang.comparable, на котором класс объекта и переопределить метод сравнения (). Возвращение 0 означает, что это один и тот же объект, в противном случае это другой объект.
②customer Sorting: Создайте сторонний класс и реализуйте интерфейс java.util.comparator. И переписать метод. Определите коллекцию из Treeset TS = New Treeset (новый сторонний класс ());
В следующем примере используются деревья для хранения естественных отсортированных объектов:
пакет cn.set; import java.util.set; import java.util.treeset; Class Student1 реализует сопоставимые <tood1> {int id; public Student1 (int id) {this.id = id; } @Override public String toString () {return this.id+""; } @Override public int hashcode () {return this.id; } @Override public boolean equals (Object obj) {if (obj exactionOf student1) {student1 stu = (student1) obj; if (stu.id == this.id) вернуть true; } вернуть false; } public int compareto (student1 o) {return (this.id-o.id); / Студент1 S1 = новый студент1 (5); Студент1 S2 = новый студент1 (1); Студент1 S3 = новый студент1 (2); Студент1 S4 = новый студент1 (4); Студент1 S5 = новый студент1 (3); set.add (s1); set.add (s2); set.add (s3); set.add (s4); set.add (s5); для (Student1 S: set) {System.out.println (s); }}} Результатом вывода:
В следующем примере используются деревья для хранения объектов, отсортированных клиентов:
пакет com.set; import java.util.set; import java.util.treeset; Class Student1 реализует сопоставимые <tood1> {int id; public Student1 (int id) {this.id = id; } @Override public String toString () {return this.id+""; } @Override public int hashcode () {return this.id; } @Override public boolean equals (Object obj) {if (obj exactionOf student1) {student1 stu = (student1) obj; if (stu.id == this.id) вернуть true; } вернуть false; } public int compareto (student1 o) {return (this.id-o.id); / Студент1 S1 = новый студент1 (5); Студент1 S2 = новый студент1 (1); Студент1 S3 = новый студент1 (2); Студент1 S4 = новый студент1 (4); Студент1 S5 = новый студент1 (3); set.add (s1); set.add (s2); set.add (s3); set.add (s4); set.add (s5); для (Student1 S: set) {System.out.println (s); }}} Результатом вывода:
Все знают, что список сортируется в порядке вставки при хранении. На самом деле, вы также можете сортировать коллекции списков по естественной сортировке и сортировке клиентов. Пожалуйста, смотрите:
Пакет cn.set; import java.util.arraylist; import java.util.collections; импорт java.util.list; класс mysort1 реализует java.util.comparator <tood3> {public int compare (Student3 O1, Student3 O2) {return o2.id-O1.id; }} класс Student3 реализует сопоставимо <tood3> {int id; public Student3 (int id) {this.id = id; } @Override public String toString () {return this.id+""; } public int compareto (Student3 o) {return (this.id-o.id); / Студент3 S1 = новый студент3 (5); Студент3 S2 = новый студент3 (1); Студент3 S3 = новый студент3 (2); Студент3 S4 = новый студент3 (4); Студент3 S5 = новый студент3 (3); list.add (s1); list.add (s2); list.add (s3); list.add (s4); list.add (s5); System.out.println (список); // естественная сортировка: collections.sort (список); System.out.println (список); // Customer Sorting Collections.sort (List, New MySort1 ()); System.out.println (список); }} Результатом вывода:
[5, 1, 2, 4, 3]
[1, 2, 3, 4, 5]
[5, 4, 3, 2, 1]
Ниже приведен принцип, согласно которому интерфейс сбора наборов в Java реализует без дублирования вставки объектов:
В коллекции Java правило определить, равны ли два объекта:
1) Определить, равны ли хэшкоды двух объектов
Если это не равно, считается, что два объекта не равны. Если это равно, поверните 2)
(Это необходимо только для повышения эффективности хранения. Фактически, это нельзя теоретически, но если нет, то эффективность будет значительно снижена во время фактического использования, поэтому мы сделаем это необходимым здесь. Эта проблема будет сосредоточена на позже.)
2) Определите, являются ли два объекта в равной степени с использованием равных
Если это не равно, подумайте, что два объекта не равны. Если это равно, подумайте, что два объекта равны (equals () является ключом к оценке того, равны ли эти два объекта)
Для общих объектов класса (кроме инкапсулированных объектов, таких как строка):
Если обычный класс не переопределяет методы hashcode () и equals (), то при сравнении объектов метод hashcode () в классе наследственных объектов, метод hashcode () в классе объекта является локальным методом. При сравнении возвращаемого значения метода сравнивается адрес объекта (ссылочный адрес). Используйте новый метод для создания объекта с тем же контентом. Конечно, разные объекты генерируются дважды. Если метод hashcode () не переопределен. Метод equals (), определенный в классе объекта, также является сравнением адресов объектов. Одним из слов: если вы не переписываете методы hashcode () и equals () обычных классов, ссылочные адреса объекта различаются в сборе сборов, а объект не будет повторяться.
Для таких объектов, как строка (строка, целое число, двойное ... и т. Д.):
Поскольку эти классы инкапсуляции сами переписали метод HashCode (), а возвратное значение переписываемого метода связано с содержанием объекта, а не с эталонным адресом. Метод equals () в этих инкапсулированных классах также переписывается, сравнивая содержание объекта, а не справочный адрес. Одним словом, объекты классов, такие как строка, сравнивают их контент в коллекции, и если тот же контент перезаписан, существующие объекты покрываются.
Выше приведено в этой статье, я надеюсь, что это будет полезно для каждого обучения.