最近看到了《 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:* *
* * The equals method for class x
, x.equals(x)
should return*true
.* x
and y
, x.equals(y)
*should return true
if and only if*y.equals(x)
returns true
.* x
, y
, and z
, if*x.equals(y)
returns true
and*y.equals(z)
returns true
, then*x.equals(z)
should return true
.* 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.* x
,*x.equals(null)
should return false
.* 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)的返回值是一样的 。
- 中国白鹤滩水电站有多强?斩获6项世界第一,建成后仅次三峡大坝 中国之最电站
- 山东高密:一座有“凤凰”的城市 高密中国之最
- 洪泽湖,悬在江苏头顶的巨型水盆,到底是一座怎样的大湖? 摘抄中国之最
- 世界地理之最!快来看一看你能知道多少? 中国之最头条
- 江南第一山:莫干山 中国之最莫干山
- 一枝独秀!陈独秀送青年毛泽东亲笔题字,10字对联堪称“天花板” 中国之最对联
- “天下第一红”邛窑如何影响中国陶瓷史? 中国之最红色
- 珠江三角洲的绸缎之美,一文带你穿越时空感受中国传统服装的魅力 中国之最服饰
- 一口气看完山西历史上的名将,个个如雷贯耳,让后人尊崇至今 山西历史之最
- 承载古法造纸工艺——一张特殊的录取通知书 设计学院历史之最