HashSet中实现不插入重复的元素
/*
看一下部分的HashSet源码....
public class HashSet<E>extends AbstractSet<E>implements Set<E>, Cloneable, java.io.Serializable
{static final long serialVersionUID = -5024744406713321676L;private transient HashMap<E,Object> map;private static final Object PRESENT = new Object();public HashSet() {map = new HashMap<>();}public HashSet(Collection<? extends E> c) {map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));addAll(c);}public HashSet(int initialCapacity, float loadFactor) {map = new HashMap<>(initialCapacity, loadFactor);}public HashSet(int initialCapacity) {map = new HashMap<>(initialCapacity);}HashSet(int initialCapacity, float loadFactor, boolean dummy) {map = new LinkedHashMap<>(initialCapacity, loadFactor);}public Iterator<E> iterator() {return map.keySet().iterator();}public boolean add(E e) {return map.put(e, PRESENT)==null;//在下面的代码中我们可以看见map.put()的代码}
}public class HashMap<K,V>extends AbstractMap<K,V>implements Map<K,V>, Cloneable, Serializable
{.....final int hash(Object k) {int h = 0;if (useAltHashing) {if (k instanceof String) {return sun.misc.Hashing.stringHash32((String) k);}h = hashSeed;}h ^= k.hashCode();//调用了改对象中的hashCode()方法,由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数h ^= (h >>> 20) ^ (h >>> 12);return h ^ (h >>> 7) ^ (h >>> 4);}public V put(K key, V value) {if (key == null)return putForNullKey(value);int hash = hash(key);//调用了上面的函数int i = indexFor(hash, table.length);for (Entry<K,V> e = table[i]; e != null; e = e.next) {Object k;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内部实现使用HashMap这个类来完成的
TreeSet的内部实现元素之间是否相等?
从上面的比较方法中可以看出,只有两个对象的hash值相等并且对象的内容也想等,那么两个对象才相等
并且判断的方法用的是 equals 方法
注意:当equals()此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。
*/import java.util.*;
public class CompTest{public static void main(String args[]){Set<myClass> st = new HashSet<myClass>();st.add(new myClass(1, "fd"));st.add(new myClass(2, "fff"));st.add(new myClass(2, "tttt"));st.add(new myClass(1, "fd"));for(Iterator<myClass> it = st.iterator(); it.hasNext();)System.out.println(it.next());}
}class myClass{public int x;public String name;public myClass(int x, String name){this.x=x;this.name=name;}public int hashCode(){return x;}public boolean equals(Object tmp){//这里是方法的重写,参数的类型和个数一定要一样....return x==((myClass)tmp).x && name.equals( ((myClass)tmp).name);}public String toString(){return x+" "+name;}
}
转载于:https://www.cnblogs.com/hujunzheng/p/3815257.html
HashSet中实现不插入重复的元素相关推荐
- java set中元素是数组_将HashSet中的元素转换为Java中的数组
首先,创建一个HashSet及其元素-HashSet hs = new HashSet(); //将元素添加到哈希集 hs.add("B"); hs.add("A&quo ...
- HashSet中是如何判断元素是否重复的
HashSet不能添加重复的元素,当调用add(Object)方法时候, 首先会调用Object的hashCode方法判hashCode是否已经存在,如不存在则直接插入元素: 如果已存在则调用Obje ...
- java中Hashset集合删除元素_从Java中的HashSet中删除单个元素
要从HashSet中删除单个元素,请使用remove()方法. 首先,创建一个HashSet-HashSet hs = new HashSet(); 现在,将元素添加到HashSet-hs.add(& ...
- HashSet中的add()方法( 五 )(详尽版)
上接 HashSet中的add()方法( 四 )(详尽版) ,我们再重写一下equals()方法来看看是否可以不能存入相同的id: 在学生类中再重写equals()方法: public class S ...
- HashSet中的add()方法( 四 )(详尽版)
上接 HashSet中的add()方法( 三 )(详尽版) ,我们重写一下Student类中的hashCode()方法来看看是否还能不能添加重复的学号了, 在学生类中重写hashCode()方法: p ...
- LeetCode.961-2N数组中N次重复的元素(N-Repeated Element in Size 2N Array)
这是悦乐书的第365次更新,第393篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第227题(顺位题号是961).在大小为2N的数组A中,存在N+1个唯一元素,并且这些元 ...
- js删除两个集合中共同元素_多个集合中的共同和独特元素
js删除两个集合中共同元素 本周,我们将暂时中断较高级别的问题和技术文章,以解决我们中许多人可能面临的一些代码问题. 没什么花哨的或太辛苦的,但是有一天它可能会节省您15分钟的时间,偶尔回到基础上也很 ...
- 多个集合中的共同和独特元素
本周,我们将暂时中断较高级别的问题和技术文章,以解决我们中许多人可能面临的一些代码问题. 没什么花哨的或太辛苦的,但是有一天它可能会节省您15分钟的时间,偶尔回到基础上也很不错. 因此,让我们开始吧. ...
- HashSet子类依靠()方法区分重复元素
HashSet类,是存在于java.util包中的类 [1] .同时也被称为集合,该容器中只能存储不重复的对象, 已知实现接口有: Serializable, Cloneable, Iterable, ...
最新文章
- 成本管理系统开源_开源教科书如何降低大学成本
- Educational Codeforces Round 12 C. Simple Strings 贪心
- UltraISO软碟通U盘安装Centos7 的各种报错及解决方案
- 网络:HTTP报文格式
- android源生setting华为,Android 设置默认桌面,默认应用,辅助功能,电池优化,设备管理器,悬浮窗等...
- php 判断update返回为0_PHP进行数据库更新update操作,返回状态
- readfile函数使用方法_1分钟学会LOOKUP函数,有网友说使用这个方法,初学者秒变大神...
- 【转】彻底删除打印机
- android禁止wifi,android – 防止WiFi-direct在不使用时关闭
- Lammps:Python上Ovito模块配置的问题与解决
- Java之XML转Json
- easyui的datagrid可编辑框小功能实例
- android 名片识别软件,手机名片识别工具Android名片全能王评测
- 好用的Web前端开发框架有哪些呢?推荐这9款
- 什么是拦截器?什么是过滤器?
- 刚性方程组的mma求解
- 计算机等级应用考试种类是什么,优·计算机等级考试分类练习题.doc
- 支持爱普生r330的打印服务器,软件让照片打印更专业_爱普生 R330_办公打印评测试用-中关村在线...
- 电路与模拟电子技术----正弦交流电路(上)
- 数据结构--------顺序存储
热门文章
- php mysql 绕过_PHP中md5绕过
- Nexus 3.31.1 maven 私服 搭建篇 linux
- flowable6.4.2流程审批后涉及到的表
- gb-heima/order 项目 处理
- javaScript PC端网页特效
- mysql查询包含字符串(模糊查询)
- php原生态三级联动_ajax php实现三级联动的方法
- 两台邮件服务器共用一个公网地址,两个不同域邮件服务器的互通
- java配置jndi连接数_JavaWeb:Tomcat下配置数据源(JNDI)连接数据库 | 学步园
- 关于指针释放的小领悟