zoukankan      html  css  js  c++  java
  • HashSet底层、及存入对象时候如何保持唯一

    HashSet底层、及存入对象时候如何保持唯一

    JDK1.8之前,哈希表底层采用数组+链表实现,即使用链表处理冲突,同一hash值的链表都存储在一个链表里。 但是当位于一个桶中的元素较多,即hash值相等的元素较多时,通过key值依次查找的效率较低。而JDK1.8中,哈希表存储采用数组+链表+红黑树实现,当链表长度超过阈值(8)时,将链表转换为红黑树,这样大大减少了查找时间。

    简单的来说,哈希表是由数组+链表+红黑树(JDK1.8增加了红黑树部分)实现的,如下图所示。

    为了更加直观的理解,HashSet是如何存储的,我们用下图解释:

    总而言之,JDK1.8引入红黑树大程度优化了HashMap的性能,那么对于我们来讲保证HashSet集合元素的唯一,其实就是根据对象的hashCode和equals方法来决定的。如果我们往集合中存放自定义的对象,那么保证其唯一,就必须复写hashCode和equals方法建立属于当前对象的比较方式。

    我们接下来举个例子:

    @Data
    public class Student { 
        private String name; 
        private int age;
        
        @Override public boolean equals(Object o) { 
            if (this == o) 
                return true; 
            if (o == null || getClass() != o.getClass()) 
                return false; 
            Student student = (Student) o; 
            return age == student.age && Objects.equals(name, student.name);
        }
        
        @Override public int hashCode() {
            return Objects.hash(name, age); 
        }
        
            
    

    注意:在将对象添加入集合时候,应该重写equals和hashCode方法。

  • 相关阅读:
    Hello China最新开发进展
    虚拟软驱影像文件制作程序下载路径:http://download.csdn.net/source/738137
    Swing透明和变换
    利用Java存储过程简化数据库操作
    Hello China V1.5 源码下载地址
    防止程序重复执行的单元
    判断文件大小的函数
    TMainMenu 隐藏与显示菜单
    最简单的Delphi程序(控制台)
    测试代码
  • 原文地址:https://www.cnblogs.com/jimlau/p/12462213.html
Copyright © 2011-2022 走看看