set接口和哈希值
set接口
set接口和List接口一样 同样继承自Collection接口 它与Collection接口中的方法基本一致 并没有对Collection接口进行功能上的补充只是比Collection接口更加严格了
与List接口不同的是 set接口中元素无序 并且都会以某种规则存入的元素不出现重复
set集合有多个子类 主要用HashSet、LinkedHashSer这两个集合
Set集合取出元素的方式可以采用 迭代器 增强for
set接口的特点:
1.不允许存储重复的元素
2.没有索引 没有带索引的方法 也不能使用普通的for循环进行遍历
HashSet集合介绍
HashSet是Set接口的一个实现类 它所存储的元素不可重复的 并且元素都是无序的(即存取顺序不一致)HashSet底层的实现其实是一个HashMap支持
HashSet是根据对象的哈希值来确定元素在集合中的存储位置 因此具有良好的存取和查找性能 保证元素唯一性的方式依赖于 hashCode于equals方法
HashSet特点
1.不允许存储重复的元素2.没有索引 没有带索引的方法 也不能使用普通的for循环遍历
3.在是一个无序的集合,存储元素和取出元素的顺序有可能不一致
4.底层是一个哈希表结构(查询的速度非常的快)
代码:
public static void main(String[] args) {
    //创建HashSet集合对象
    HashSet<Integer> set = new HashSet<>();
    //添加数据
    set.add(1);
    set.add(2);
    set.add(3);
    set.add(1);
    //使用迭代器遍历集合
    Iterator<Integer> iterator = set.iterator();
    while (iterator.hasNext()){
        System.out.println(iterator.next());//不能有重复是HashSet的一大特点
    }
    System.out.println("---------------------------");
    //使用增强for循环遍历
    for (Integer integer : set) {
        System.out.println(integer);//不能有重复是HashSet的一大特点
    }
}
运行结果:

哈希值
哈希值:是一个十进制的整数 由系统随机给出(就是对象的地址值 是一个逻辑地址 是模拟出来得到地址 不是数据实际存储的物理地址)在Object类有一个方法 可以获取对象的哈希值
方法:int hashCode() 返回该对象的哈希吗值
代码:
public static void main(String[] args) {
    String s="a";
    int c = s.hashCode();
    System.out.println(c);
}
运行结果:

也就是说a的十进制是97
HashSet集合存储数据的结构
在JDK1.8之前 哈希表底层采用数组+链表 即使用链表处理冲突 同一hash值的链表都存储在一个链表里 但是当位于一个桶中的元素较多 即hash值相等的元素较多时 通过key值依次查找的效率较低
而JDK1.8中,哈希表存储采用数组+链表+红黑树实现 当链表长度超过阀值(8)时 将链表转换为红黑树 这样大大减少了查找时间

 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号