Set:元素是无序的,元素不可以重复
|——HashSet:hashCode是判断元素存储的区域的。 存储某个元素时,先判断hashCode值,确定这个元素存储的区域。 如果hashCode值相同,表明存储的区域相同,这时调用equals方法比较两个元素是否相同。 所以在创建元素时应该保证当两个元素用equals比较相同时,它们的hashCode也必须相等。 如果它们的hashCode不相等,它们将不会存储到一个区域,那么也就不会调用equals进行比较了。这时便可能导致存入重复元素。 而默认的hashCode值的结果是跟内存地址有关的,所以当两个元素内存地址不同时,hashCode也不同。 所以我们一般要复写hashCode方法。尽量定义不同的hashCode值,这样避免不必要的equals比较,增加效率。 而当我们已经加入元素后,我们变不能再更改跟hashCode值有关的成员变量了。这会导致内存泄漏。 (总结来说:HashCode是靠hashCode和equals来判断元素唯一性的。)
|——TreeSet:可以对Set中的元素进行排序。保证元素唯一性的方法是compareTo方法返回值为是否为0。如果为0则为相同元素。如果不为0则不是相同元素。 有两种排序方式:一种是元素自身具备比较性,元素需要实现Comparable接口,覆盖compareTo方法,这种方式叫自然排序,或默认排序。 第二种:自身不具备比较性,或具备比较性不是所需要的,那么在TreeSet初始化时传入比较方式。
==和equals的区别:==比较的是两个对象的内存地址。equals比较的是两个对象的内容。当==为true时,肯定equals为true;当equals为ture时,==不一定为true。 |