• Set接口HashSet实现类


    java.util.Set接口 extends Collection接口

    Set特点:
    1、不允许有重复的元素
    2、没有索引,没有带索引的方法,也不能使用普通的for遍历

    java.util.HashSet集合 implements Set接口

    Set接口的一个实现类
    HashSet特点:
    1、没有重复的元素
    2、没有索引,没有带索引的方法,也不能使用普通的for遍历
    3、是一个无序的集合,存储和取出的顺序有可能不一致
    4、底层是一个哈希表结构(查找快)

    public class Demo01Set {
        public static void main(String[] args) {
            Set<Integer> set = new HashSet<>();
            set.add(3);
            set.add(3);
            set.add(2);
            set.add(12);
            set.add(22);
            set.add(13);// 添加
            set.add(222);
            System.out.println(set.size());
            Iterator<Integer> it = set.iterator();
            while(it.hasNext()) {// while迭代器遍历
                Integer next = it.next();
                System.out.println(next);
    
            }
    
            for(Integer next: set) {// for each遍历
                System.out.println(next);
            }
        }
    }
    

    哈希值

    Object类有一个hashCode方法,返回对象的哈希值,一个十进制的值

    Student stu = new Student();
    int hashcode = stu.hashCode();
    

    Set不允许元素重复的原理

    重写了hashCode方法和equals方法,set加入一个对象,首先查看该对象的哈希值,然后看哈希表对应的哈希值是否有对象存储了,如果还没有那么就直接插入哈希表中;如果已经存储着相同哈希值的对象,那么就要使用equals方法比较是不是有相同的对象,如果没有插入。注意哈希表在解决冲突问题的时候采用的是拉链法,在同一个哈希值存储的的元素个数小于8时使用链表,大于等于8就改成了红黑树(红黑树是一棵自平衡的二叉树)

    HashSet存储自定义类

    没有重写hashCode方法和equals方法之前,两个对象有一样的属性也会被认为是相等的

    Person p1 = new Person("zhuobo", 12);
    Person p2 = new Person("zhuobo", 12);
    
    System.out.println(p1.hashCode());
    System.out.println(p2.hashCode());
    
    System.out.println(p1.equals(p2));
    
    // output
    //p2p1hashcode: 1282788025
    //p2hashcode: 2114694065
    //false
    

    重写hashCode方法和equals方法
    重写后属性相同就会被认为是相等的,这样在集合中插入对象的时候就不会出现同name同age的对象被插入两次出现重复的现象

    @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            Person person = (Person) o;
            return age == person.age &&
                    Objects.equals(name, person.name);
        }
    
        @Override
        public int hashCode() {
            return Objects.hash(name, age);
        }
    
    // output now有相同的hashCode
    //p1hashcode: -304811560
    //p2hashcode: -304811560
    //true
    
  • 相关阅读:
    Python sys.argv用法详解及应用
    Python map() 函数
    Python中enumerate用法详解
    闭包,作用域链,垃圾回收,内存泄露
    jQuery 常用代码集锦
    关于作用域和作用域链最完整的简述
    git 合并commit
    apollo-client
    关于对称加密和解密
    接口校验机制
  • 原文地址:https://www.cnblogs.com/zhuobo/p/10625301.html
Copyright © 2020-2023  润新知