Первое, что вам нужно изучить, это 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
оба или нет;никогда не один. (очень важно, потому что он должен удовлетворять свойству: a.equals(b) == true --> a.hashCode() == b.hashCode()
- Будьте осторожны с написанием
boolean equals(Thing other)
вместо этого; это не является правильным @Override
.
- Для ненулевых ссылок
x, y, z
, equals
должно быть: - рефлексивно:
x.equals(x)
. - симметрично:
x.equals(y)
тогда и только тогда, когда y.equals(x)
- переходный: если
x.equals(y) && y.equals(z)
, то x.equals(z)
- непротиворечивый:
x.equals(y)
не должен изменяться, если объекты не мутировали x.equals(null) == false
- Общий контракт для
hashCode
следующий: - непротиворечивый: возвращает то же число, если только не произошла мутация
- в соответствии с
equals
: если x.equals(y)
, тоx.hashCode() == y.hashCode()
- Строго говоря, неравенство объектов не требует неравенства хеш-кода
- , но неравенство хеш-кода обязательно требует неравенства объектов
- То, что считается мутацией, должно быть согласовано между
equals
и hashCode
.
Далее, вы можете наложить порядок ваших объекты.Вы можете сделать это, сделав тип вашего инструмента Comparable
или предоставив отдельный Comparator
.
Наличие любого из них облегчает сортировку ваших объектов (Arrays.sort
, Collections.sort(List)
).Он также позволяет использовать SortedSet
, например, TreeSet
.
Дополнительные показания по стеку: