HashSet的存储原理:

  1、将要传入的数据根据系统的hash算法得到一个hash值;

  2、根据hash值可以得出该数据在hash表中的位置;

  3、判断该位置上是否有值,没有值则把数据插入进来;如果有值则再次判断传入的值与原值是否地址或equals相同,如果相同则不存,否则通过链表的方式 存储到该位置。

如果两个对象equals,但是没有重写hashcode,就会导致集合中存储多个相等的对象!所以必须重写!

比如:

Set<Integer> set = new HashSet<Integer>();

  set.add( e );//add方法是return map.put( e , PRESENT) == null;

本质是实例化医个HashMap对象 ---->map = new HashMap<>();

然后是map.put()方法,

public V put(K key,V value){

  if(table == EMPTY_TABLE){

    inflateTable(threshold);  //此处是初始化一张哈希表,表为数组结构

  }

  int hash = hash(key);  //根据key值,计算出对应的int类型的hash值

  int i = inexFor(hash,table.length):  //通过hash值在table表中得到一个存储的位置

  //判断指定下标的位置是否为空,如果为空则跳出循环,直接添加

  //否则与该位置上的链表元素一一比较,如果哈希值相同且地址或equals相同,则返回

  //否则添加进来

  for(Entry<K,V> e = table[i]; e != null; e = e.next){

    Object k ;

    //如果哈希值相等并且地址相等(需重写equals)

    if(e.hash == hash && ((k = e.key) == key || key.equals(k)){

      V oldValue = e.value;

      e.value = value;

      e.recordAccess(this);

      return oldValue;

    }

  }

  modCount++;

  addEntry(hash, key, value, i);   //以链表的方式添加元素

  return null;

}

谈谈HashSet的存储原理及为什么重写equals必须重写hashcode方法的更多相关文章

  1. HashSet中存方用户自己定义数据类型数据,重写equals方法和hashCode方法

    import java.util.Set; import java.util.HashSet; public class SetTest { public static void main(Strin ...

  2. HashSet中的元素必须重写equals方法和hashCode方法

    http://jingyan.baidu.com/article/d5a880eb8fb61d13f147cc99.html 1.为什么必须重写这两个方法. 2.什么事hashSet去重,符合什么样的 ...

  3. 对象作为 map 的 key 时,需要重写 equals 方法和 hashCode 方法

    对象作为 map 的 key 时,需要重写 hashCode 和 equals方法 如果没有重写 hashCode 方法,那么下面的代码示例会输出 null 我们首先定义一个对象:BmapPoint, ...

  4. Hibernate中为什么要重写equals方法和hashcode方法

    1.*为什么要重写equals方法,首先我们来看一下equals源码: public boolean equals(Object anObject) { if (this == anObject) { ...

  5. JAVA正确地自定义比较对象---如何重写equals方法和hashCode方法

    在实际应用中经常会比较两个对象是否相等,比如下面的Address类,它有两个属性:String province 和 String city. public class Address { priva ...

  6. Java重写equals方法和hashCode方法

    package com.ddy; public class User {     private Integer id;     private String name;     private St ...

  7. HashSet的存储原理

    HashSet的底层用哈希散列表来存储对象(默认长度为16的数组),假如: Set set=new HashSet(); set.add(obj); 内部存储过程为:定义h=obj.hashCode, ...

  8. java中equals方法和hashcode方法的区别和联系,以及为什么要重写这两个方法,不重写会怎样

    一.在Object类中的定义为:public native int hashCode();是一个本地方法,返回的对象的地址值.但是,同样的思路,在String等封装类中对此方法进行了重写.方法调用得到 ...

  9. Java 如何重写对象的 equals 方法和 hashCode 方法

    前言:Java 对象如果要比较是否相等,则需要重写 equals 方法,同时重写 hashCode 方法,而且 hashCode 方法里面使用质数 31.接下来看看各种为什么. 一.需求: 对比两个对 ...

随机推荐

  1. 理解API和SDK的区别

    API--功能的集成(封装等级低) SDK--任务的集成(封装等级高) 比如,App中完成微信支付.整个过程下来需要三次与微信服务器的访问,一次block回调.这四个步骤可以当作是4个api,如果把这 ...

  2. null值可以赋给引用变量,不能给基本类型

    下面正确的写法是? cbyte i=128 boolean i=null long i=0xfffL double i=0.9239d null表示没有地址:null可以赋值给引用变量,不能将null ...

  3. Caffe2 的基本数据结构(Basics of Caffe2 - Workspaces, Operators, and Nets)[4]

    这篇文章主要介绍Caffe2的基本数据结构: Workspaces Operators Nets 在开始之前最好先阅读以下Intro Turorial 首先,导入caffe2.其中core和works ...

  4. linux--用户管理--useradd

    用户分类 1 root 超级管理员 2 系统用户 就是 某一个服务中 自动产生的用户 不是认为创建的,不能用于登录计算机 只是保证某一个服务的正常运行 比如数据库 3 普通用户 用户必须属于一个且只有 ...

  5. Java基础 -5

    方法的定义与使用 方法(method)的基本定义 本次方法定义在主类之中并且由主方法直接调用,所以方法的定义语法形式如下: public static 返回值类型 方法名称([参数类型 变量, ... ...

  6. Java基础 -2.4

    字符型char类型 在任何的编程语言之中,字符都可以与int进行互相转换,也就是这个字符中所描述的内容可以通过int获取其内容所在的系统编码 public class ddd { public sta ...

  7. C++中的四种类型转换运算符static_cast、dynamic_cast、const_cast和reinterpret_cast的使用

    1.上一遍讲述了C语言的隐式类型转换和显示类型转换,C语言之所以增加强制类型转换,就是为了强调转换的风险性,但这种强调风险的方式是比较粗放了,粒度比较大,它并没有表明存在什么风险,风险程度如何. 2. ...

  8. 「CF1004E」Sonya and Ice Cream

    题目描述 给定一个 \(N\) 个点的树,要选出一条所含点的个数不超过 \(K\) 的一条路径,使得路径外的点到这条路径的距离的最大值最小. 数据范围:\(1\le K \le N \le 10^5\ ...

  9. 在idea中设置指向源代码(scala)

    1.到官网下载scala源代码 点击如下链接下载源码:http://www.scala-lang.org/download/all.html 选择需要的版本点击进行下载,我选择的是2.11.8版本,如 ...

  10. 126、Java面向对象之引用传递实例四,修改类成员的属性值

    01.代码如下: package TIANPAN; class Message { private String info = "此内容无用"; // 定义String类型属性 p ...