java的set集合——hashSet

本文介绍了Java中的HashSet集合,其底层基于哈希表实现,确保元素不重复。通过重写Student类的equals()和hashCode()方法,可以确保HashSet在存储学生对象时不会添加学号重复的学生。测试案例展示了当尝试添加学号已存在的学生时,HashSet会自动忽略,从而保持集合中对象的唯一性。
摘要由CSDN通过智能技术生成

一,set集合

set也是collection的接口实现类,并且他的功能全部来自collection
但是他的数据不能重复

二,hashSet集合

底层数据结构是哈希表
对集合中的迭代顺序不保证(存进去的顺序跟取出来的顺序不一定一样)
没有索引,无法使用for循环遍历,但是增强for循环可以,因为他实际上迭代器
是set的实现类,不能有重复元素

三,练习

用hashset储存学生对象,学号重复的不添加

Student类

public class Student {
    public String id;
    public String name;
    public int age;

    public Student(){}
    public Student(String id,String name,int age){
        this.age=age;
        this.id=id;
        this.name=name;
    }

    @Override
    public String toString(){
        return "学号:"+id+"\t"+"姓名:"+name+"\t"+"年龄:"+age;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Student student = (Student) o;
//      如果为空,即当前集合中没有元素,即没有相同id返回false
//      如果不为空,判断id是否在集合中存在了,若存在则不进入if语句体,而是进入下一步(即最后一句返回true)
//      若不存在则进入if语句体返回false
        if (id != null ? !id.equals(student.id) : student.id != null) return false;
        return true;
    }
    /*      重写hashCode(),使所有Student对象的哈希值相等
            如果不重写,不同的对象哈希值不同,这样就不会进入内容的比较直接插入hashset集合中
            重写把所有哈希值返回为相同的值,使之进入equals()中比较内容
     */
    @Override
    public int hashCode() {
        return 0;
    }
}

测试类

import java.util.HashSet;

public class HashTest {
    public static void main(String[] args) {
        HashSet<Student> hs=new HashSet<Student>();
        Student s1=new Student("111","小华",21);
        Student s2=new Student("222","小明",23);
        Student s3=new Student("333","小丽",22);
        hs.add(s1);
        hs.add(s2);
        hs.add(s3);
        System.out.println(hs);
        System.out.println("--------------------------------------------------------------");
        Student s4=new Student("333","小强",23);
//        先判断哈希值,不同直接存,相同则判断id(因为我重写的equals只判断id是否一样)
//        注意返回false表示没有重复,存入集合;返回true表示有重复,不存储,我老是想错
        hs.add(s4);
        System.out.println(hs);
    }

}

结果

可以看到,由于小强的id已经存在,他并没有存进去 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值