这个问题主要是在集合中,Set集合需要保证元素的唯一性。而判断一个元素是否唯一就涉及到两个元素的唯一判断。每一个种集合的底层数据结构不一样,则判断元素唯一性的方式也就不一样。
hashset底层是哈希表数据结构。哈希表存储元素时,必须使用元素对象的hashcode方法获取该对象的哈希值,来确定该对象在表中的位置,如果hashcode不同他就认为这两个对象肯定是不同的两个对象。就会存入集合。如果hashcode相同,则会继续判断两个元素的equals方法是否为ture。如果为ture,那么认为两个对象一样。将要存储的对象不会存储到集合中。反之则会将hashcode+1顺延存储(hash数据结构的“桶”理论)。
而在treeset集合中则是实现Comparable接口(覆盖CompareTo方法)和Comparator接口(覆盖Compare方法)来让自己对象具有可比较性。保证元素唯一性。
而在ArrayList中仅仅需要重写equlas方法去判断。元素是否相同。但是由于list集合本身的有序性,很少用到。
|