Set接口HashSet实现类

摘要:
java.util。集合接口ExtendesCollection接口集合功能:1。不允许重复元素。2.没有索引,没有索引方法,也没有遍历java的常用方法。utilHashSet是implementsSet接口的一个实现类。HashSet功能:1.没有重复的元素。2.没有索引,没有索引方法,也没有遍历的普通方法。3.这是一个无序的集合。存储和检索的顺序可能不一致。4.

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就改成了红黑树(红黑树是一棵自平衡的二叉树)
Set接口HashSet实现类第1张

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

免责声明:文章转载自《Set接口HashSet实现类》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇MATLAB绘制概率图(probplot)数字化转型下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

解决哈希冲突的三种方法(拉链法、开放地址法、再散列法)

解决哈希冲突的三种方法(拉链法、开放地址法、再散列法) - 小猛同学的博客 - CSDN博客 https://blog.csdn.net/qq_32595453/article/details/80660676 2018年06月12日 10:16:57 上篇博客我们说到了,什么是哈希冲突,其实就是再采用哈希函数对输入域进行映射到哈希表的时候,因为哈希表的位...

面渣逆袭:HashMap追魂二十三问

大家好,我是老三。 HashMap作为我们熟悉的一种集合,可以说是面试必考题。简单的使用,再到原理、数据结构,还可以延伸到并发,可以说,就一个HashMap,能聊半个小时。 1.能说一下HashMap的数据结构吗? JDK1.7的数据结构是数组+链表,JDK1.7还有人在用?不会吧…… 说一下JDK1.8的数据结构吧: JDK1.8的数据结构是数组+链表+...

Android Verified Boot 2.0简要

from: https://ressrc.com/2018/10/26/android-verified-boot-2-0%E7%AE%80%E8%A6%81-thanksgining/   简要 AVB2.0被用于启动引导,此用法添加一个“vbmeta.img”镜像。public key被编译到bootloader中用于校验vbmeta数据,vb...

02_编程规约——集合处理

1.【强制】关于hashCode和equals的处理,必须遵循如下规则 1.1 只要重写equals,就必须重写hashCode。 1.2 因为Set存储的是不重复对象,依据hashCode和equals进行判断,所以Set存储的对象必须重写这两个方法。 1.3 如果自定义对象为Map的键,那么必须重写hashCode和equals。 说明:String重...

了解动态链接(五)—— 动态符号表

ilocker:关注 Android 安全(新入行,0基础) QQ: 2597294287 动态符号表 (.dynsym) 用来保存与动态链接相关的导入导出符号,不包括模块内部的符号。而 .symtab 则保存所有符号,包括 .dynsym 中的符号。 动态符号表中所包含的符号的符号名保存在动态符号字符串表 .dynstr 中。 使用 readelf 查看...

hash函数的选择

哈稀函数按照定义可以实现一个伪随机数生成器(PRNG),从这个角度可以得到一个公认的结论:哈希函数之间性能的比较可以通过比较其在伪随机生成方面的比较来衡量。 一般来说,对任意一类的数据存在一个理论上完美的哈希函数。这个完美的哈希函数定义是没有发生任何碰撞,这意味着没有出现重复的散列值。在现实中它很难找到一个完美的哈希散列函数,而且这种完美函数的趋近变种在实...