HashSet哈希表存储、重复元素存储底层探究
元素是无序(存入和取出的顺序不一定一致),元素不可以重复;(jdk1.7/jdk1.8是有序的)
查看Api会发现,set集合的功能与Collection集合的功能是一致的(就方法调用而言);
HashSet哈希表存储,底层数据结构是哈希表。
从代码上看,equals方法没有被调用
是因为HashSet集合存储是先调用hashCode方法,这里我们将hashCode方法重写一下看看
HashSet是如何保证元素唯一性的呢?
是通过元素的两个方法:hashCode与equals方法来完成;
如果hashCode值相同,才会判断equals是否为true;
如果hashCode值不同,那么不会调用equals。
注意:对于判断元素是否存在,以及删除等操作,依赖的方法同样是hashCode、equals方法。
集合框架TreeSet
自然排序 and 比较器排序
TreeSet可以对set集合中元素进行排序
String实现了Comparable接口,所以可以直接进行排序
引用数据类型想要排序,必须实现Comparable接口
其他引用数据类型没有实现Comparable接口,
那么会出现java.lang.ClassCastException: com.javaxl.Peroon cannot be cast to java.lang.Comparable,
实现引用数据类型实现此接口就没问题了。
注意:排序时,当主要条件相同时,一定要判断次要条件
TreeSet排序的第二种方式
当元素自身不具备比较性时,或者具备的比较性不是所需要的;
注意:这时需要让集合自身具备比较性
在集合初始化时,就有了比较方式;
定义一个类,实现comparator接口,实现compare方法
当两种排序都存在时,比较器排序优先级更高
因此比较器用的多一些,在实际开发中,很多时候,引用数据类型是否具有比较性,或者比较规则,可能不由开发人员自己决定,
那么开发人员想要对应的引用数据类型按照自己的排序方式进行排列,那么就需要实现comparator接口,实现compare方法
用两个案例说明
1、打破原有的person排序规则进行排序
2、按照字符串长度进行排序(String默认是按照hashCode值进行排序的)
TreeSet数据结构(二叉树)
可以对set集合进行排序,底层数据结构是二叉树;
理解图如下:
泛型(概述及使用、泛型类、泛型方法、静态方法泛型、泛型接口)
图解如下: