本帖最后由 1453149997 于 2014-4-5 14:32 编辑
如果按照老师的结论:即“如果元素的hashCode值不同,不会调用equals”,那么请问,集合是怎么知道要插入的元素A的哈希值和集合中的某个元素的哈希值不一样的?
有两种猜想:
(1)调用集合中的每个元素的hashcode的方法,然后用A的哈希值和每个元素的哈希值比较,但是这样的做法效率很低,显然违背了HashSet设计的初衷(即查询效率高)
(2)HashSet被划分为不同的区域,每一段都有一个哈希值来代表;HashSet创建之初,并没有被划分区域,只有有元素存入时,才需要根据元素的哈希值来确定分配存储区域;后续元素插入时,要根据某个哈希值是否存在来确定是否需要分配新的空间;
如果(1)不成立,那么在HashSet中存在了另一个集合B,用来存储哈希值;当A需要插入时,用A的哈希值和B中的元素比较,可以快速确定是否存在和A哈希值相同的元素,如果有,则调用equals方法和此区域的所有元素比较;如果没有,则HashSet根据哈希值另外分配空间,存储新的元素
请问我的理解合理吗?
|