博客信息

集合框架Set(HashSet哈希表存储、重复元素存储底层探究)

发布时间:『 2019-05-13 02:42』  博客类别:java基础  阅读(707)

元素是无序(存入和取出的顺序不一定一致),元素不可以重复;

 

查看Api会发现,set集合的功能与Collection集合的功能是一致的(就方法调用而言);


HashSet哈希表存储

底层数据结构是哈希表

小李飞刀_集合框架


小李飞刀_集合框架


小李飞刀_集合框架





HashSet存入重复元素

同姓名同年龄视为同一个人 ,重复元素


从代码上看,equals方法没有被调用

小李飞刀_集合框架


是因为HashSet集合存储是先调用hashCode方法,这里我们将hashCode方法重写一下看看

小李飞刀_集合框架


小李飞刀_集合框架


HashSet是如何保证元素唯一性的呢?

是通过元素的两个方法:hashCodeequals方法来完成;

如果hashCode值相同,才会判断equals是否为true

如果hashCode值不同,那么不会调用equals

小李飞刀_集合框架


注意:对于判断元素是否存在,以及删除等操作,依赖的方法同样是hashCodeequals方法。

 

ListSet判断重复对象的区别?

List只依赖于equals方法

Set依赖于hashCodeequals方法

小李飞刀_集合框架


相关代码如下

package com.javaxl;

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

/**
 * @author 小李飞刀
 * @site www.javaxl.com
 * @company
 * @create  2019-05-13 14:45
 */
public class HashSetDemo {
    public static void main(String[] args) {
        HashSet hs = new HashSet();
//        hs.add("java01");
//        hs.add("java02");
//        hs.add("java03");
//        hs.add("java04");
//        hs.add("java02");
//        hs.add("java03");
        hs.add(new Peroon("java01",11));
        hs.add(new Peroon("java02",12));
        hs.add(new Peroon("java03",13));
        hs.add(new Peroon("java04",14));
        hs.add(new Peroon("java02",12));

        System.out.println("包含Java02:"+hs.contains(new Peroon("java02",12)));
        System.out.println("删除Java02:"+hs.remove(new Peroon("java02",12)));
        System.out.println("包含Java02:"+hs.contains(new Peroon("java02",12)));

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

class Peroon{
    private String name;
    private int age;

    public Peroon() {
    }

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

    @Override
    public int hashCode() {
        return this.getName().hashCode()+this.age*16;
    }

    @Override
    public boolean equals(Object obj) {
        if(obj instanceof Peroon){
            Peroon p = (Peroon)obj;
            System.out.println(this.getName()+"......equals......"+p.getName());
            return (this.getName().equals(p.getName()) && this.getAge() == p.getAge());
        }
        return false;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}



关键字:     Java基础       集合框架       HashSet  

备案号:湘ICP备19000029号

Copyright © 2018-2019 javaxl晓码阁 版权所有