一 关于set想说的之Set的实现类及必要的方法

最近看到了《 in Java》的第17章 容器深入探究,17.6 Set和存储顺序 。自己写了写测试代码,加深下理解 。主要设计()方法(主要是为了方便打印),()方法,()方法,()方法 。
结论
首先明确Set接口有三种不同的实现,()、()、() 。
() :快速的定位、读取,会根据hash值来存放,因此读取出来的顺序未必就是插入的顺序 。
():存入set容器中的内容是按照一定的顺序排列的 。
():既可以实现快速的定位读取,又可以满足读取出来的顺序就是插入顺序 。
除了、等内部就已经实现了()、()、()、()方法,都实现了接口,用户自己定义的类的实例(对象),如果要放在set,则要实现(),()、()方法,实现接口 。
在《 in java》中说:“如果不为你的键覆盖()和()方法,那么使用散列的数据结构(, , , )就无法正确处理你的键” 。
因为()用来确保你的键是唯一的,而如果你想只覆盖()方法,而不覆盖()方法(你认为可以使用父类#()方法,按照对象的地址来进行hash),但是在#()的源码注释中,有说:如果()方法返回true,则每个对象调用()方法也必须返回相同的hash值 。
1.()方法
用来实现Set中元素的不重复性,如果不覆盖()()方法,默认使用父类的方法,则只是比较对象的引用是否相同 。下面是#()方法的实现 。
/*** Indicates whether some other object is "equal to" this one.* * The equals method implements an equivalence relation* on non-null object references:*

    *
  • It is reflexive: for any non-null reference value*x, x.equals(x) should return*true.*
  • It is symmetric: for any non-null reference values*x and y, x.equals(y)*should return true if and only if*y.equals(x) returns true.*
  • It is transitive: for any non-null reference values*x, y, and z, if*x.equals(y) returns true and*y.equals(z) returns true, then*x.equals(z) should return true.*
  • It is consistent: for any non-null reference values*x and y, multiple invocations of*x.equals(y) consistently return true*or consistently return false, provided no*information used in equals comparisons on the*objects is modified.*
  • For any non-null reference value x,*x.equals(null) should return false.*
* * The equals method for class Object implements * the most discriminating possible equivalence relation on objects; * that is, for any non-null reference values x and* y, this method returns true if and only* if x and y refer to the same object* (x == y has the value true).* * Note that it is generally necessary to override the hashCode* method whenever this method is overridden, so as to maintain the* general contract for the hashCode method, which states* that equal objects must have equal hash codes. ** @paramobjthe reference object with which to compare.* @returntrue if this object is the same as the obj*argument; false otherwise.* @see#hashCode()* @seejava.util.Hashtable*/public boolean equals(Object obj) {return (this == obj);}
代码里的注释也挺重要的,所以也复制过来了 。注释主要讲的是:
(1)对于非空对象x,y,x.(y)返回true,当且 仅当(if and only if) x,y指向了相同的对象 。
(2)对于非空对象及null,x.(null)返回false 。
(3)方法具有自反性(),即对于非空对象x,x.(x)返回true 。
(4)方法具有对称性(),即对于非空对象x,y,x.(y)与y.(x)的返回值是一样的 。