TreeSet底层数据结构:二叉树结构
TreeSet存储数据方式:
A:第一个添加的数据作为根结点。
B:从第二个开始:
每个数据从根结点开始比较,如果大了,往右放,小了,往左边放,如果相同,替换。
TreeSet的获取规则:从根节点开始,获取数据规则,是按照每个数据的左中右原则。
TreeSet保证元素排序有两种方式:
A:自然顺序 让对象所属的类去实现Comparable接口,无参构造。
在自然排序中,根据返回值保证排序。
正数:说明元素比以前的元素大,往后放。
负数:说明元素比以前的元素小,往前方。
零 :元素就不参加到集合中,这就是保证唯一性的原理。
B:比较器接口,Comparator带参构造。
HashSet底层数据结构:哈希表。
哈希表:根据哈希算法存储的,存储的就是对象的哈希值。
由于不同对象的哈希值不一样,所以6个对象全部存储成功,没有去掉重复值。
解决方法:我们想去掉重复值,首先重写hashCode(),返回值 是0;
接着重写了equals()方法,比较对象成员变量
重写之后,哈希值都是0。这个时候存储,哈希表结构,提供哈系统结构。这个结构在处理哈希值都相同的情况。当哈希值相同的时候,对象会存储到一个桶结构中,看源码后,还是会继续走equals()方法看成员变量值是否相同。
可以去重了,但是效率降低了,需要重写两个方法hashCode()和equals()。
一般来说我们在hashCode()方法上不会直接返回一个固定值,这个值应该是变化的,这个方法和对象成员变量相关,我们只需要把对象成员变量值相加即可。
公式:引用数据类型.hashCode()+基本数据类型*x(非固定值)。
|
|