关于HashSet不可不知的几点要诀

HashSet是Set接口的实现,特点是无重复和无序。它通过hashCode和equals方法实现元素的去重。当添加元素时,重复的元素只会出现一次。同时,文章展示了如何为自定义对象重写hashCode和equals方法,以确保在HashSet中正确处理这些对象。
摘要由CSDN通过智能技术生成

关于HashSet不可不知的几点要诀

Hashset:HashSet是Set接口的实现类,它有以下特点:

  1. 无重复.集合里没有重复的元素。这是通过HashCode查重实现的
  2. 无序.表现在
    1. 存储无序.无视add顺序
    2. 输出无序.无视print顺序

HashSet的使用

Code Snippet 1


import java.util.HashSet;
import java.util.Iterator;
import java.util.Objects;

public class Example1{
    public static void main(String[] args) {
        HashSet hs = new HashSet();
        hs.add("1");
        hs.add("1");
        hs.add("dv");

        Iterator it = hs.iterator();
        while (it.hasNext()){
            Object i  = it.next();
            System.out.println(i);
        }
    }
}

运行结果:

代码分析:通过new方式创建HashSet类的一个对象hs,使用hs的方法add()添加元素,这里的"1" 与 “dv” 属于标题类型的,由于在创建hs时为说明hs类型,所以系统默认泛化类型,因此对于String&Integer均可输入。接下来通过hs的iterator()方法创建迭代器it,利用while循环对hs进行打印。在while循环打印hs时,我们使用了局部变量 i 做为next()方法返回值的承接。和上面所说的泛化类型一样的是,这里的Object类也是一种泛化类型,它可以包含各种元素,如果在前面已经确定了HashSet 的类型,这里的Object当然就可以替换为选定的数据类型。值得注意的是,在添加元素的过程中,我们添加了两处"1",不过在打印过程中只有一个"1",这体现了HashSet无重复。

Code Snippet 2


import java.util.HashSet;
import java.util.Objects;

class Student{				//Student类
        private String id;
        private String name;
        public Student(String id,String name){
            this.id = id;
            this.name = name;
        }
        public String toString(){			//toString方法是Object类的方法,默认继承
            return id + ":" +name ;
        }
        public int hashCode(){
            return id.hashCode();
        }

            public boolean equals(Object obj){  	//重写equals方法
            if(!(obj instanceof Student)){
                return false;
                }
            if (this == obj){
                return true;
            }
           
            Student stu = (Student) obj;
            boolean b = this.id.equals(stu.id);
            return b;
        }
}
public class Example2 {
    public static void main(String[] args) {
        HashSet hs = new HashSet();
        Student stu1 = new Student("1","张三");
        Student stu2 = new Student("2","李四");
        Student stu3 = new Student("2","李四");

        hs.add(stu1);
        hs.add(stu2);
        hs.add(stu3);

        System.out.println(hs);
    }
}

运行结果:

代码分析:定义Student类,定义一系列静态方法,重写equals方法。equals方法是HashSet实现无重复的关键。使用equals方法需要传参,这里的Object当然也可以替换成实际类型。equals方法通过嵌套两个if语句来实现元素查重。 if(!(obj instanceof Student) 实现对元素种类相同这一前提的保证,因为这里的HashSet仅仅输入学生的相关信息,增强了代码的鲁健性;第二个if语句通过 == 比较实现元素的查重,需要注意的是Object类元素的比较是对于其引用位置的比较。 Student stu = (Student) obj; 代码实现了将两个输入的stu转化为同一类进行对比,最后再对于元素哈希值对比并返回结果。Main函数通过add()方法导入三个元素。在代码执行时,由于 stu1 与 stu2 均是 new 出的结果,所以它们的索引不同;不过由于哈希值一样,所以返回false,舍弃stu。

HashCode

哈希值(Hash Value)是根据数据内容通过哈希函数计算得到的固定长度的整数值。它也被称为哈希码(Hash Code)或散列值(Hash Value)。

哈希函数是一种将任意大小的数据映射到固定大小值的函数。这个映射过程是不可逆的,即无法从哈希值反推回原始数据。

不同的数据通常会产生不同的哈希值,但是相同的数据总是会产生相同的哈希值。

由于哈希函数的特性,即使原始数据发生微小的变化,其哈希值也会发生较大的变化。

哈希值在计算机科学中有广泛的应用。其中一项主要应用是用于数据存储和检索的数据结构,例如哈希表(Hash Table)或哈希集合(Hash Set)。哈希值被用作数据的索引,可以快速定位和访问存储在哈希表中的数据。

在Java中,每个对象都有一个默认的哈希值,可以通过调用对象的hashCode()方法获取。默认情况下,hashCode()方法返回对象的内存地址的哈希码。Java允许我们重写hashCode()方法,根据对象的属性值计算哈希值,以便在需要时进行更精确的数据存储和检索。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值