美文网首页
Java-hashCode和hashSet

Java-hashCode和hashSet

作者: hello_world_cxm | 来源:发表于2021-01-10 20:31 被阅读0次
package Hello1;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.function.Consumer;


public class Test14 {
    public static void main(String[] args) {
        //Set接口规定元素内容不重复
        //相同内容的两个对象,最终的hash码可能是不一样,所以经过对hash码换算之后的下标也有可能不一样,所以导致两个内容相同的
        //对象被放在了不同的下标下,导致最终的没有去重
        //如果hash码的换算结果一样的话,就会调用Studentt类中的equals方法,实现了去重
        //如果想要hash码的换算结果一样,那么hashcode就得一样,可以在studentt中实现hashcode()方法,返回int
        //HashSet数据结构依然是数组 但是元素不是按照顺序摆放的 看下面add的顺序,注意与打印的结果顺序对比是否一样
        //如果保证所有对象hash码是相同的,那么就能保证能去重
        //hashcode这种数据结构被称为 散列表 分散排列 
        //如果让元素分散排列?让不同对象的hash码不同,让相同对象hash码相同,尽可能保证不同对象,返回不同的hashcode,目的为了
        //提高存储速度,因为要提高效率就要尽可能少用equals进行对比 目的让元素分散得更加均匀
        //重点:覆盖hashCode()方法,保证相同对象返回相同的int,尽可能保证不同对象返回不同的int
        //重点:覆盖equals()方法,保证相同对象返回true
        Set<Studentt> s=new HashSet<>();
        //学生类没有覆盖equals方法,所以默认使用object的equals方法 object 的equals方法则是比较内存地址
        Studentt s1 =new Studentt("Liucy",45); 
        Studentt s2 =new Studentt("cxme",34); 
        Studentt s3 =new Studentt("kgps",45); 
        Studentt s4 =new Studentt("Liucy",45); 
        Studentt s5 =new Studentt("cfefe",45); 
        System.out.println(s1.hashCode());  //虚拟机 会把hash码经过换算 转为int下标 
        System.out.println(s2.hashCode());
        System.out.println(s3.hashCode());
        System.out.println(s4.hashCode());
        System.out.println(s5.hashCode());
        s.add(s1);
        s.add(s2);
        s.add(s3);
        s.add(s4);
        s.add(s5);
        print(s);
        print1(s);
        print2(s);
        
    }
    //遍历方法1
    public static <T> void print(Set<T> s) {
        Iterator<T> it = s.iterator();
        while(it.hasNext()){
            T name = it.next();
            System.out.println(name);
        }
        System.out.println("------------------------");
    }
    //遍历方法2
    public static <T> void print1(Set<T> s) {
        for (T x : s) {
            System.out.println(x);
        }
        System.out.println("------------------------");
    }
    //遍历方法3
    public static <T> void print2(Set<T> s) {
        s.forEach(new Consumer<T>() {
            @Override
            public void accept(T arg0) {
                System.out.println(arg0);
            }
        });
        System.out.println("------------------------");
    }
}
class Studentt{
    String name;
    int age;
    public Studentt(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return "Studentt [name=" + name + ", age=" + age + "]";
    }
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + age;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Studentt other = (Studentt) obj;
        if (age != other.age)
            return false;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }
}
    


相关文章

网友评论

      本文标题:Java-hashCode和hashSet

      本文链接:https://www.haomeiwen.com/subject/ukylaktx.html