Collection集合体系
set集合特点
不包含重复元素的集合(即使添加重复元素之后,最终也只能显示一个)
没有带索引的方法,所以不能使用普通的for循环遍历
HashSet:对集合的迭代顺序不作任何保证
哈希值
哈希值:是JDK根据对象的地址或者字符串或者数字算出来的int类型的数值(我们要知道哈希值不是对象的地址值,它是一个int类型的数值)
object类中有一个方法可以获取对象的哈希值-----Public int hashCode():返回对象的哈希码值
对象的哈希值特点:
同一个对象多次调用hashCode()方法返回的哈希值是相同的
默认情况下,不同对象的哈希值是不同的,而重写hashCode()方法,可以实现让不同的对象的哈希值相同。
HashSet集合
HashSet集合特点:
1、底层数据结构是哈希表
2、对集合的迭代顺序不做任何保证,也就是说不保证存储和取出的元素顺序一致
3、没有带索引的方法,所以不能使用普通for循环遍历(可以使用迭代器遍历和增强for遍历)
4、由于是set集合,所以是不包含重复元素的集合
HashSet集合保证元素唯一性源码分析
HashSet集合添加一个元素的过程:
HashSet集合存储元素:
要保证元素唯一性,需要重写hashCode()和equals()
LinkedHashSet
集合特点:
哈希表和链表实现的set接口,具有可预测的迭代次序
由链表保证元素有序,也就是说元素的存储和取出顺序是一致的
由哈希表保证元素唯一,也就是说没有重复的元素
TreeSet
集合特点:
元素有序,这里的顺序不是只存储和取出的顺序,而是按照一定的规则进行排序,具体排序方式取决于构造方法。
TreeSet():根据其元素的自然排序进行排序
TreeSet(Comparator comparator):根据指定的比较器进行排序
没有待索引的方法,所以不能使用普通for循环遍历
由于是Set集合,所以不包含重复元素的集合
比较器排序Comparator
compareTo按字典顺序比较两个字符串
案例:
//创建TreeSet集合对象,通过比较器进行排序
TreeSet<Student> ts =new TreeSet<Student>(new Comparator<Student>() {
@Override
public int compare(Student s1, Student s2) {
//主要条件:比较总成绩
int num=s2.getSum()-s1.getSum();
//次要条件:比较单科成绩和名字
int num2 =num==0?s1.getChinese()-s2.getChinese():num;
int num3=num2==0?s1.getName().compareTo(s2.getName()):num2;
return num3;
}
});