出现以上问题的原因是,如果只重写了 equals 方法,那么默认情况下,Set 进行去重操作时,会先判断两个对象的 hashCode 是否相同,此时因为没有重写 hashCode 方法,所以会直接执行 Object 中的 hashCode 方法,而 Object 中的 hashCode 方法对比的是两个不同引用地址的对象,所以结果是 false,那么 equals 方法就不用执行了,直接返回的结果就是 false:两个对象不是相等的,于是就在 Set 集合中插入了两个相同的对象。
Java 的基本数据类型有 8 种,包括 6 种数字类型、1 种字符类型和 1 种布尔类型。不同的数字类型对应不同的范围,按照范围从小到大的顺序依次是:byte、short、int、long、float、double。
当向 HashSet 集合中存入一个元素时,HashSet 会调用该对象的 hashCode方法来得到该对象的 hashCode 值,然后根据该hashCode 值决定该对象在 HashSet 中的存储位置。
前面我们讲了链表这种数据结构,相比于数组的好处是对元素在增删场景效率特别高,弥补了数组新增和删除效率极低的缺陷。同样链表也存在自己致命的缺陷,那就是查询和修改效率太低。其实数组和链表这两种数据结构刚好是互补的,只是前者的优点是后者的缺点,而后者的优点是前者的缺点。