你需要学习的第一件事是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
接下来,您可能希望对对象进行排序。为此,可以使类型实现具有可比性
,或者提供单独的比较器
。
具有任何一个都可以轻松对对象进行排序 (, )。它还允许您使用 ,例如 。Arrays.sort
Collections.sort(List)
SortedSet
TreeSet
有关堆栈溢出的更多读数: