HashSet如何判定两个元素相同
在介绍java的集合时,我们提到,set是一个“罐子”。我们可以向其中放入各式各样的元素,这些元素没有顺序,但不能相同。其中,HashSet是最常用的一个实现类。
首先,我们看下HashSet的源码。
/**
* Constructs a new, empty set; the backing <tt>HashMap</tt> instance has
* default initial capacity (16) and load factor (0.75).
*/
public HashSet() {
map = new HashMap<>();
}
/**
* Constructs a new, empty set; the backing <tt>HashMap</tt> instance has
* the specified initial capacity and default load factor (0.75).
*
* @param initialCapacity the initial capacity of the hash table
* @throws IllegalArgumentException if the initial capacity is less
* than zero
*/
public HashSet(int initialCapacity) {
map = new HashMap<>(initialCapacity);
}
可以看出,HashSet是基于HashMap实现的,用其来保存元素。保存时,由HashMap的key、value来实现。
回顾下集合的父接口Collection中提供的方法。
// Comparison and hashing boolean equals(Object o); int hashCode();
HashMap集合判断两个元素相等的标准:两个对象的equals方法相等,并且hashCode方法返回值也相等。
下面通过几个例子看一下:
1、只重写equals方法
public class HashSetTest1 {
//重写equals方法,返回true
public boolean equals(Object obj){
return true;
}
}
2、只重写hashCode方法
public class HashSetTest2 {
//重写hashCode方法,返回1
public int hashCode(){
return 1;
}
}
3、重写hashCode、equals方法
public class HashSetTest3 {
//重写hashCode方法,返回2
public int hashCode(){
return 2;
}
//重写equals方法,返回true
public boolean equals(Object obj){
return true;
}
}
测试类如下:
public static void main(String[] args) {
HashSet test1 = new HashSet();
// 添加HashSetTest1
test1.add(new HashSetTest1());
test1.add(new HashSetTest1());
System.out.println("test1中元素的个数:" + test1.size());
HashSet test2 = new HashSet();
// 添加HashSetTest2
test2.add(new HashSetTest2());
test2.add(new HashSetTest2());
System.out.println("test2中元素的个数:" + test2.size());
HashSet test3 = new HashSet();
// 添加HashSetTest3
test3.add(new HashSetTest3());
test3.add(new HashSetTest3());
System.out.println("test3中元素的个数:" + test3.size());
}
执行结果为:
思考:
1、 HashSet中只把两个HashSetTest3对象当成了一个对象,因为只有他俩符合上述的规则,即equals、hashCode方法都相等。
2、如果需要重写equals方法,那么也应该重写hashCode方法。如HashSetTest1。
通过hashCode的返回值,我们可以看到,他返回的是一个int类型的值。在运算中,我们根据该元素的hashCode值计算出该元素的存储位置,以便快速定位。
HashSet如何判定两个元素相同的更多相关文章
- HashSet中是如何判断元素是否重复的
HashSet不能添加重复的元素,当调用add(Object)方法时候, 首先会调用Object的hashCode方法判hashCode是否已经存在,如不存在则直接插入元素: 如果已存在则调用Obje ...
- Set集合对象比较两个元素的方法
Set集合对象比较两个元素的方法并不是根据“equals()”方法的返回值来比较.而是用“hashCode()”方法来进行判断.只要两个元素的“hashCode()”方法的返回值相同,就认为两个元素相 ...
- 输出有序数组的中两个元素差值为指定值diff的两个元素
题目: 输出有序数组的中两个元素差值为指定值diff的两个元素. 思路: 这与输出两个元素的和的值为一定值类似,需要两个指针,不同的是:指针不是一左一右,而是一前一后. 如果差值等于diff,则返回: ...
- 给一已经排序数组A和x,求A中是否包含两个元素之和为x
亲爱的大神老爷们,这是小渣第一次写blog,欢迎大家来喷(批评指正),算法渣因为面试中连这道题都不会写就自己琢磨了一下,也参考了网上大家的做法 解法一: 思路:从首尾向目的靠拢,因为已经排序,[假设存 ...
- Openjudge-计算概论(A)-找和为K的两个元素
描述: 在一个长度为n(n < 1000)的整数序列中,判断是否存在某两个元素之和为k. 输入第一行输入序列的长度n和k,用空格分开.第二行输入序列中的n个整数,用空格分开.输出如果存在某两个元 ...
- margin叠加相邻两个元素的上下margin是叠加在一起
<!doctype html><html><head><meta charset="utf-8"><title>无标题文 ...
- 交换数组中两个元素的位置,元素包括key和value 一维数组
/*author: yangyu@sina.cndescription: 交换数组中两个元素的位置,元素包括key和value,具体用法见下面的例子*/$arr = array(11=>'a', ...
- 《算法导论》习题2.3-7 查找集合S中是否有两个元素和为X---Java实现
代码如下: public class MergeSort { public static void sort(int [] A,int p, int r) { if(p<r) { int q = ...
- js改变数组的两个元素的位子,互换、置顶
//js数组的元素上移和下移动 var fieldData=[ {name:'id',value:'ID'} , {name:'username',value:'用户名'} , {name:'emai ...
随机推荐
- 剑指offer js算法练习(1-10)
1.二维数组中的查找 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数, ...
- 解决WordPress设置错误的url网站不能访问的问题
通过WordPress后台首选项更改了网站url地址之后,网站就会出现访问不了的情况,一般来说,网站后台也登陆不上去了,我从网上寻找到了四种方法,这四种方法前三种都是需要登陆到后台的,但实际上出错后, ...
- Java OOP——第二章 继承
1. 继承: ●继承是面向对象的三大特征之一,是JAVA实现代码重用的重要手段之一: ●继承是代码重用的一种方式,将子类共有的属性和行为放到父类中: ●JAVA只支持单继承,即每一个类只有一个父类,继 ...
- hash和history的区别
vue-router 中hash模式和history模式. 在vue的路由配置中有mode选项,最直观的区别就是在url中hash 带了一个很丑的 # ,而history是没有#的.vue默认使用ha ...
- vue 路由对象(常用的)
路由对象 在使用了 vue-router 的应用中,路由对象会被注入每个组件中,赋值为 this.$route ,并且当路由切换时,路由对象会被更新. 路由对象暴露了以下属性: $route.path ...
- 继上一篇bootstrap框架(首页)弄的资讯页面
还是和上一篇首页一样给出每一步的注解: 做的有点简单,但是,以后还是会加深的.毕竟是初学者嘛! <html lang="zh-cn"> <head> ...
- Node.js(一)----安装
1.下载 地址 https://nodejs.org/en/download/ 注: 系统为ubuntu 下载的源码包 tar.gz 或者 wget https://nodejs.org/dist/v ...
- python面向对象-cs游戏示例
#!/usr/local/bin/python3 # -*- coding:utf-8 -*- class Role(object): n = 123 # 类变量 name = "我是类na ...
- Python基于jieba的中文词云
今日学习了python的词云技术 from os import path from wordcloud import WordCloud import matplotlib.pyplot as plt ...
- CMDB介绍
CMDB https://lupython.gitee.io/2018/05/05/CMDB%E4%BB%8B%E7%BB%8D/ 尚泽凯博客地址 传统运维与自动化运维的区别 传统运维: 1.项目 ...