Set接口
无序无下标元素不可重复 添加的顺序和遍历的顺序不一致 方法全部继承Collection的
接口使用:
1.添加删除数据 可以看到数组结果是无序的
2.遍历操作
set实现类
HashSet实现类(重要)
存储结构是哈希表(数组+链表+红黑树) 基于HashCode值计算出元素存放位置,当存入元素的哈希码相同时,会调用equals确认,如果为true则认为是重复的不能存了
案例1: 1.添加删除数据 可以看到,添加元素的顺序与遍历的顺序不一致 新建集合时,< >里面的内容表示数据类型为String,后面那一个<>可以写也可以不写(泛型的表示,避免了类型强转)
2.遍历操作,判断操作 案例2:(复杂点的集合) HashSet存储过程: 现根据hashcode计算保存的位置,如果这个位置是空的,则直接保存,如果不为空则这个位置本身有元素,还要执行equals,如果equals为true(新的和旧的相等),则认为是重复,就添加不进来了,否则为false形成链表。
1.添加元素 说明:添加时person.add(p1),这样是添加不进来的,因为认为是重复的,他们的地址相同就是同一个; 但是通过new来添加时是可以添加进来的,是新new出来,不管原来是否已经添加过都可以再添加,重复的也可以,如果不想让相同的重复的元素添加进来,重写hashcode方法和equals方法,然后就不能添加进来了,认为是重复的。
2.删除元素
直接删p1是可以的,就是之前定义的对象。 在没有重写两个方法的时候,用new来删除之前定义的对象是删不掉的,在重写方法之后,判断就是之前定义的相同的对象,然后就可以删掉了。 3.遍历 4.判断
TreeSet实现类
基于排序实现元素不重复 实现了SortedSet接口,对集合元素自动排序 元素对象的类型必须实现Comparable接口,指定排序规则 CompareTo方法确定是否为重复元素 存储结构:红黑树(二叉查找树)
TreeSet使用
案例1: 输出结果的序列一般是按照a-z排的
案例2: 1.添加元素 添加元素报错:Person不能转成java.long.comparable 原因:Treeset存储结构是二叉查找树,左边的节点都要比右边的节点要小,每添将进来的元素都要和根节点进行比较,比根节点小要添加在左边,比根节点大的放在右边。 此时我们往集合里添加三个person对象,但是没有比较的对象,还不知道怎么比,比年龄还是姓名,所以报了异常。此时元素要实现一个Comparable接口,写好比较规则 compareTo()方法返回值为0,则认为是重复的元素,添加不进来了 如果n1=0,则返回n2,比较年龄,否则返回n1,比较姓名。 先按姓名比,然后按年龄比,此时就能添加进去了 添加年龄不同的: 添加相同的:是添加不上的,认为是重复的 compareTo()方法返回值为0,则认为是重复的元素,添加不进来了
2.删除操作 这两种都可以删掉,第二种new出来的认为是p3相同的,重复的所以可以删掉,因为实现了comparable接口 3.遍历操作,判断操作 Comparator接口: 实现定制比较,是一个比较器 Comparable:可比较的
TreeSet案例
要求:使用TreeSet集合实现字符串按照长度进行排序(原来是按照拼音字母排序的),使用定制比较规则:Comparator接口实现定制比较
|