Ответ 1
Первое, что вам нужно изучить, это java.util.Set
API.
Вот небольшой пример того, как использовать его методы:
Set<Integer> numbers = new TreeSet<Integer>();
numbers.add(2);
numbers.add(5);
System.out.println(numbers); // "[2, 5]"
System.out.println(numbers.contains(7)); // "false"
System.out.println(numbers.add(5)); // "false"
System.out.println(numbers.size()); // "2"
int sum = 0;
for (int n : numbers) {
sum += n;
}
System.out.println("Sum = " + sum); // "Sum = 7"
numbers.addAll(Arrays.asList(1,2,3,4,5));
System.out.println(numbers); // "[1, 2, 3, 4, 5]"
numbers.removeAll(Arrays.asList(4,5,6,7));
System.out.println(numbers); // "[1, 2, 3]"
numbers.retainAll(Arrays.asList(2,3,4,5));
System.out.println(numbers); // "[2, 3]"
Как только вы знакомы с API, вы можете использовать его для хранения более интересных объектов. Если вы не знакомы с equals
и hashCode
, уже сейчас самое подходящее время для начала.
В двух словах:
-
@Override
оба или none; никогда не только один. (очень важно, потому что он должен удовлетворять свойству:a.equals(b) == true --> a.hashCode() == b.hashCode()
- Соблюдайте осторожность при написании
boolean equals(Thing other)
; это не является правильным@Override
.
- Соблюдайте осторожность при написании
- Для ненулевых ссылок
x, y, z
,equals
должно быть:- reflexive:
x.equals(x)
. - симметричный:
x.equals(y)
тогда и только тогда, когдаy.equals(x)
- transitive: if
x.equals(y) && y.equals(z)
, тоx.equals(z)
- compatible:
x.equals(y)
не должен изменяться, если объекты не были мутированы -
x.equals(null) == false
- reflexive:
- Общий контракт для
hashCode
:- cons: возвращать тот же номер, если не произошло мутация
- соответствует
equals
: ifx.equals(y)
, тоx.hashCode() == y.hashCode()
- строго говоря, объектное неравенство не требует неравенства хеш-кода
- но неравенство хеш-кода обязательно требует объектного неравенства
- То, что считается мутацией, должно быть последовательным между
equals
иhashCode
.
Затем вы можете наложить порядок своих объектов. Вы можете сделать это, создав свой тип Comparable
или предоставив отдельный Comparator
.
Имея либо упрощает сортировку ваших объектов (Arrays.sort
, Collections.sort(List)
). Он также позволяет использовать SortedSet
, например TreeSet
.
Другие чтения в stackoverflow: