Set集合:是一个接口,可通过常用实现类hashSet运用功能。
Set集合特点:不包含重复的元素;没有带索引的方法,所以不能用for循环实现遍历,可通过iterator迭代器和增强for循环实现遍历;不保证存放元素的顺序,可能与存入的顺序不一致。
哈希值:是JDK根据对象的地址或字符串或数字算出来的int类型的数值。
HashSet集合概述和特点:继承Set集合并实现该集合接口。
1.底层数据结构是哈希表;
2.对集合的迭代顺序不做保证,即存储和取出的顺序不一定一致;
3.没有带索引的方法,所以不能用for循环遍历
4.由于是Set集合,所以是不包含重复的元素。
HashSet集合保证元素不重复,可以查看该集合的add方法的源码分析;如下图分析
哈希表:
下图为采用数组+链表实现的逻辑方式:
1.HashSet集合默认初始容量为16;
2.计算每个需要存储元素的哈希值,通过hashCode方法获取;
3.通过哈希值对16取余,根据余数将元素放到对应的位置。若位置为空则直接放入,若已经有元素了则比较哈希值,不同则通过链表方式放入已有元素下面;哈希值相同再通过equals比较值是否相同,都相同则去重该元素不放入,值不同则也是通过链表方式放入已有元素下面。
LinkedHashSet集合的概述和特点:由哈希表和链表实现的set接口。
TreeSet集合概述:间接继承了set集合,元素是有序排列的集合,但不是按存储和取出的顺序,而是按照一定的规则的排序,具体排序方式取决于构造方法。
元素的自然排序主要通过Comparable接口实现,所以如果元素是自定义类型一般是要实现该接口才能自然排序,不然会报类型转换错误ClassCastException。
Comparable的使用:看compareTo方法返回的什么数据而进行排序,为0则表示每个数都是重复的,为1则表示后一个存储的比前一个大(升序),为-1则表示后一个存储的前一个小(降序)
Comparator的使用:作为比较器,作为入参可用在TreeSet(Comparator comparator)中实现排序规则,主要也是重写compareTo方法。