package test10;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class Demo19_set接口 {
@SuppressWarnings({ "unchecked", "rawtypes" })
public static void main(String[] args) {
// set不包含重复元素方法与collection一致,set集合去除元素的方式只有一种:迭代器
/*不保证有序
* HashSet:哈希表结构,不同步,保护元素唯一性依赖于: hashCode(); equals();【哈希值不一样时不会执行】方法
* TreeSet:可以对set集合里面的元素进行排序 二叉树结构 使用的对象比较方法的结果是否为零,相同元素不存
* TreeSet中元素的排序有两种方式:
* 1.元素自身具备的自然排序,其实就是实现了Comparable接口重写了compareTo方法如果自身的元素不具备自然排序,或者具备的自然排序不是所需要的,这时只能用第二种方式
* 2.比较器 其实就是在创建TreeSet集合时,在构造函数中指定的具体的比较方式需要定义一个类实现comparator接口,重写compare方法
* 在往集合中存储对象时,通常该对象都需要覆盖hashCode,equals同时实现comparable接口,同时实现comparable接口建立对象的自然排序
* 通常还有一个方法也会复写toString();
*
* 数组中存储的是元素,哈希表对应的是关系
* 哈希表查询的速度比数组快,重复元素无法存储,保证了元素的唯一性
*
* 哈希表
* 給定一个数值组“ab” = 97 98
* 创建一个十个位置的哈希表
* 给定一个算法function(int date)
* {
* (97+98)%10= 5;
* }
* 将ab存储到哈希表上5的位置
*
* 每一个新建的对象都有自己独特的哈希值
*
* 怎么解决哈希冲突(两个对象的哈希值相同)问题?
* 元素的哈希值hashCode()一致了,这时就会再次判断元素的内容是否相同(equals)
* 如果equals反悔了true,以为这两个元素相同,不存储
* 如果返回false,一位这两个元素不相同,存储。继续通过算法算出位置。拉链法
*
* 为什么学生对象没有保证唯一性?
* 通过哈希表我们可以看出存储元素时,先调用元素对象的hashCode()方法,而每一个学生对象都是新建立的你 对象
* 所以每一个对象的哈希值都不同,也就不能判断equals了
* 想要保证同姓名同年龄的学生对象的唯一性就必须重写Object中的hashCode方法
*
*
*
* 集合体系
*
* List :新出的子类都是以list结尾的通常是非同步的
* |--ArrayList :array 数组 查询速度快
* |--LinkedList:link 链表 增删速度快
*
* Set :
* |--HashSet :Hash 哈希表 查询速度更快 元素唯一性 通过hashCode,equals来保证唯一性
* |--TreeSet :tree 二叉树 可以排序 Comparable-compareTo Comparator-compare方法
* */
Set set =new HashSet();
set.add("1111");
set.add("2222");
set.add("4444");
set.add("4444");
set.add("4444");
set.add("3333");
set.add("2222");
set.add("4444");
set.add("2222");
set.add("2222");
set.add("4444");
set.add("4444");
set.add("2222");
for (Iterator it = set.iterator(); it.hasNext();) {
System.out.println(it.next());
}
}
}
Demo19_Set接口
最新推荐文章于 2022-04-15 14:18:28 发布