Set接口
- 无序,不可重复
- 没有索引方式,没有带索引的方法,不能使用普通的for循环
HashSet子类
底层是哈希表结构,查询的速度非常快。不保证顺序不变。
常用方法还是Collection的方法,只是没有索引方法
哈希值:
十进制的整数,是系统自动给出的逻辑地址,不是物理地址。Object类中通过hashCode()方法获取
底层结构:
哈希表,1.8版本前,哈希表=数组(table=16)+链表;1.8版本之后,哈希表=数组+链表+红黑树(链表长度大于8时)(提高查询速度)
数组中存放哈希值,相同哈希值的下面通过链表/红黑树放置不同元素
Set集合元素不重复的原理?
Set集合在调用add()方法的时候,会调用元素的hashCode()和equals()方法,判断元素是否重复。具体步骤为:首先调用hashCode()计算哈希值,如果数组中没有则加入,否则就是有哈希冲突;接下来判断哈希冲突的元素与之的equals()比较,如果返回true则不加入,否则加入。
前提:存储的元素必须重写hashCode()和equals()方法,确保元素不重复。
HashSet集合无序理解?
HashSet在保存数据的时候显然还是得按一定顺序放入其背后的数组中,但顺序不是用户可控制的,对用户来说就是“无序”。
那么每次遍历的结果是否相同呢????
LinkedHashSet子类
属于HashSet的子类,不同在于:
LinkedHashSet的底层结构是 :哈希表+链表(记录元素的存储顺序)
保证LinkedHashSet中的元素是有序的。
Collections集合工具类的方法
addAll()、shuffle()打乱、sort()升序排列、
注意:
- sort(List<T>)方法中如果是自定义的元素对象,元素对象类必须实现comparable接口,重写compareTo()方法,自定义比较规则。
- sort(List<T>,Comparator <? super T>)方法中,采用的Comparator接口,需要sort方法的内部重写compare()方法。
comparable和Comparator的区别:
- comparable接口:自己和别人比较,需要自己重写compareTo()方法,自定义比较规则。
- Comparator接口:相当于找一个第三方的裁判比较。