在HashSet中添加元素时我们为什么不直接使用equals()方法进行元素重复性判断
- 我们的HashSet中添加元素的时候,我们最开始先要通过添加元素调用hashCode()方法判断,得到我们的新添加元素的位置,然后同一位置上如果有其他元素,这个时候我们我们还要判断这两个元素的hash值是否相同,如果这两个对象的hash值相同了,这个时候我们就最后再使用equals()方法判断两个对象是不是真正的重复了
- 我们为什么要这样做?
- 其实就是一种优化,就是我们先要进行特殊判断,这个时候我们的程序执行的效率就会提高
我们的程序执行的时候先要进行特殊性比较,要先判断特殊性,最后再进行一般性判断,使用这种方式可以提高我们程序的执行效率 ---- 我们在底层源码中随处可见的都是先进行特殊性的判断,最后再进行一般性判断
那么为什么说我们使用先判断特殊性最后再判断一般性就会提高程序的效率?为什么我们一直使用一般性判断程序的执行效率相对较慢
- 如果我们一直使用一般性判断,也就是使用一直使用equals()方法进行判断
- 如果现在我们的集合中已经有9999个元素了,这个时候如果我们要添加第10000个元素了,这个时候我们就要调用这个新添加元素的模板类的equals()方法进行9999次判断,要和我们的前面的9999个元素都进行判断
- 如果我们先试用特殊性进行判断,然后使用一般性进行判断
- 如果现在我们的集合中已经有9999个元素了,这个时候如果我们要添加第10000个元素了,这个时候我们就先调用这个新添加元素模板类的hashCode()方法得到返回值之后通过散列函数判断这个新添加元素的位置,如果两个位置相同的话,我们再通过判断这个新添加元素的hash值是否和我们的这个位置上的其他元素的hash值相同,如果这个时候hash值也相同的话,这个时候我们再通过调用我们新添加元素的所在类的equals()方法判断这两个元素是不是相同
总结:
我们之所以不直接使用equals()方法判断传入HashSet中的元素是否重复,而是通过先进行特殊性的判断是因为这样可以提高程序的执行效率