HashSet实现原理
/*
HashSet的实现原理:
	  往HashSet添加元素的时候,HashSet会先调用元素的hashCode方法得到元素的哈希值 ,
	  然后通过元素 的哈希值经过移位等运算,就可以算出该元素在哈希表中 的存储位置。
情况1: 如果算出元素存储的位置目前没有任何元素存储,那么该元素可以直接存储到该位置上。
情况2: 如果算出该元素的存储位置目前已经存在有其他的元素了,那么会调用该元素的equals方法与该位置的元素再比较一次
			      ,如果equals返回的是true,那么该元素与这个位置上的元素就视为重复元素,不允许添加,如果equals方法返回的是false,那么该元素运行添加。
*/
 import java.util.*;
 class Person{
     String name;
     int id;
     public Person(String name, int id) {
         this.name = name;
         this.id = id;
     }
     @Override
     public String toString() {
         return "Person [name=" + name + ", id=" + id + "]";
     }
     @Override
     public int hashCode() { //此时hashCode方法被调用4次
         System.out.println("hashCode==============");
         return this.id;
     }
     @Override
     public boolean equals(Object obj) { ////此时equals方法被调用1次
         System.out.println("equals------------");
         Person p = (Person) obj;
         return this.id == p.id;
     }
 }
 public class Demo5 {
     public static void main(String[] args) {
         HashSet set = new HashSet();
         set.add(new Person("大师兄", 1));
         set.add(new Person("二师兄", 3));
         set.add(new Person("沙师弟", 2));
         //id唯一性,若id相同,就应该为同一人,为此,重写hashCode方法和equals方法
         System.out.println("添加成功吗?" + set.add(new Person("师傅", 1)));
         Iterator it = set.iterator();
         while(it.hasNext()){
             System.out.println(it.next());
         }
     }
 }
结果:
hashCode==============
hashCode==============
hashCode==============
hashCode==============
equals------------
添加成功吗?false
Person [name=大师兄, id=1]
Person [name=沙师弟, id=2]
Person [name=二师兄, id=3]
注意,这个是无序、不可重复的
比如:
HashSet set = new HashSet();
set.add(new Person("大师兄", 1));
set.add(new Person("二师兄", 3));
set.add(new Person("沙师弟", 2)); set.add(new Person("大师兄", 43));
set.add(new Person("二师兄", 333));
set.add(new Person("沙师弟", 22));
set.add(new Person("大师兄", 33));
set.add(new Person("二师兄", 344));
set.add(new Person("沙师弟", 211));
此时结果:
hashCode==============
hashCode==============
hashCode==============
hashCode==============
hashCode==============
hashCode==============
hashCode==============
hashCode==============
hashCode==============
hashCode==============
equals------------
添加成功吗?false
Person [name=大师兄, id=1]
Person [name=大师兄, id=33]
Person [name=沙师弟, id=2]
Person [name=二师兄, id=3]
Person [name=沙师弟, id=211]
Person [name=沙师弟, id=22]
Person [name=二师兄, id=344]
Person [name=大师兄, id=43]
Person [name=二师兄, id=333]
HashSet实现原理的更多相关文章
- Java集合 HashSet的原理及常用方法
		
目录 一. HashSet概述 二. HashSet构造 三. add方法 四. remove方法 五. 遍历 六. 合计合计 先看一下LinkedHashSet 在看一下TreeSet 七. 总结 ...
 - Java集合之HashSet/TreeSet原理
		
Set集合 1.HashSet 只去重复, 没有顺序 HashSet的add方法会调用hashCode和equals, 所以存储在HashSet中的对象需要重写这两个方法. 2.TreeSet ...
 - List、Set集合系列之剖析HashSet存储原理(HashMap底层)
		
目录 List接口 1.1 List接口介绍 1.2 List接口中常用方法 List的子类 2.1 ArrayList集合 2.2 LinkedList集合 Set接口 3.1 Set接口介绍 Se ...
 - Java set接口之HashSet集合原理讲解
		
Set接口 java.util.set接口继承自Collection接口,它与Collection接口中的方法基本一致, 并没有对 Collection接口进行功能上的扩充,只是比collection ...
 - 红黑树规则,TreeSet原理,HashSet特点,什么是哈希值,HashSet底层原理,Map集合特点,Map集合遍历方法
		
==学习目标== 1.能够了解红黑树 2.能够掌握HashSet集合的特点以及使用(特点以及使用,哈希表数据结构) 3.能够掌握Map集合的特点以及使用(特点,常见方法,Map集合的遍历) 4.能够掌 ...
 - Java HashSet工作原理及实现
		
1. 概述 This class implements the Set interface, backed by a hash table (actually a HashMap instance). ...
 - HashSet实现原理及源码分析
		
HashSet简介 HashSet是Set接口实现,它按照Hash算法来存储集合中的元素 不保证元素顺序 HashSet是非同步的,如果多个线程同时访问一个HashSet,要通过代码来保证其同步 集合 ...
 - Java面试题 从源码角度分析HashSet实现原理?
		
面试官:请问HashSet有哪些特点? 应聘者:HashSet实现自set接口,set集合中元素无序且不能重复: 面试官:那么HashSet 如何保证元素不重复? 应聘者:因为HashSet底层是基于 ...
 - 3.Java集合-HashSet实现原理及源码分析
		
一.HashSet概述: HashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持,它不保证set的迭代顺序很久不变.此类允许使用null元素 二.HashSet的实现: 对于Ha ...
 
随机推荐
- db2 sequence 查询
			
1. 查询名字 select * from sysibm.sysequences where seqname='wx_Id' 2.nextVal select wx_seq_id.currval fr ...
 - Android开发之Bitmap的高效加载
			
BitmapFactory类提供了四类方法:decodeFile, decodeResource, decodeStream和decodeByteArray 分别用于支持从文件系统,资源,输入流以及字 ...
 - 自适应滤波:维纳滤波器——GSC算法及语音增强
			
作者:桂. 时间:2017-03-26 06:06:44 链接:http://www.cnblogs.com/xingshansi/p/6621185.html 声明:欢迎被转载,不过记得注明出处哦 ...
 - 学习CSS了解单位em和px的区别
			
这里引用的是Jorux的“95%的中国网站需要重写CSS”的文章,题目有点吓人,但是确实是现在国内网页制作方面的一些缺陷.我一直也搞不清楚px与em之间的关系和特点,看过以后确实收获很大.平时都是用p ...
 - pyqt样式表语法笔记
			
pyqt样式表语法笔记 pyqt QSS python 样式表 因为软件课设的原因开始学习使用pyqt4,才发现原来它也有样式表,而且语法跟css基本相同,而且一些功能实现起来感觉比js要简单方便得多 ...
 - 当Node.js遇见Docker
			
Node.js Best Practices - How to Become a Better Developer in 2017提到的几点,我们Fundebug深有同感: 使用ES6 使用Promi ...
 - Tcl与Design Compiler (九)——综合后的形式验证
			
本文属于原创手打(有参考文献),如果有错,欢迎留言更正:此外,转载请标明出处 http://www.cnblogs.com/IClearner/ ,作者:IC_learner 这里来讲一下forma ...
 - Realm数据库的简单介绍和使用
			
给大家介绍一个数据库操作的框架Realm,本文主要以iOS 平台的使用场景为例. realm是一个跨平台移动数据库引擎,支持iOS.OS X(Objective-C和Swift)以及Android: ...
 - [转]使用sklearn进行集成学习——理论
			
转:http://www.cnblogs.com/jasonfreak/p/5657196.html 目录 1 前言2 集成学习是什么?3 偏差和方差 3.1 模型的偏差和方差是什么? 3.2 bag ...
 - 在Selenium Webdriver中使用XPath Contains、Sibling函数定位
			
前言 在一般情况下,我们通过简单的xpath即可定位到目标元素,但对于一些既没id又没name,而且其他属性都是动态的情况就很难通过简单的方式进行定位了. 在这种情况下,我们需要使用xpath1.0内 ...