2018.9.29学习笔记(Set集合的特点,HashSet,TreeSet)
1 set集合
回顾9.27日笔记关于collection集合大家族的介绍,set和list的区别有三点:(1)无序(2)无索引(3)不允许重复
相反list集合的特点就是:(1)有序(2)有索引(3)允许重复
那么学习set的重点在于它是如何保证唯一性的。
基本数据类型的数据唯一性还是比较好理解的,那么对象类型它是怎么分辨的呢?其实我猜测是它是根据对象的地址值判断的,如果我们认为同姓名,同年龄是同一个人,该如何操作呢?重写equals方法?重写equals方法是不可以的,需要重写hashcode方法,这里解释一下原理:hashcode和equal的关系,只有hashcode返回的值相同,才会执行equals方法来进行比较,就好比方说上火车,hashcode就相当于车票,当hashcode相同就是座位相同才会调用equals方法比较。
2 HashSet的作用即去重
package com.haidia.Set;
import java.util.HashSet;
import java.util.Scanner;
/*
* 输入字符串去重后输出字符
* 因为不需要按照顺序输出,所以用HashSet,如果需要按照顺序可以使用LinkedHashSet
*/
public class Demo1 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
char[] strArr = str.toCharArray();
HashSet<Character> hs = new HashSet<>();
for (char c : strArr) {
hs.add(c);
}
for (Character character : hs) {
System.out.println(character);
}
}
}
3 TreeSet
TressSet毫无疑问是惟一的,但是它还有另外一个特点就是可以排序的。
既然TreeSet可以排序,那我试试存储对象的时候它是怎么排序的。
很明显,出错了,这是为什么呢,因为TreeSet中的排序依赖的是比较器,只需要在Person上实现Compareable接口就可以了。
排序的原理就是按照compareTo方法返回的值进行排序,具体见下图。
4 复习匿名内部类