/*
看一下部分的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中实现不插入重复的元素相关推荐

  1. java set中元素是数组_将HashSet中的元素转换为Java中的数组

    首先,创建一个HashSet及其元素-HashSet hs = new HashSet(); //将元素添加到哈希集 hs.add("B"); hs.add("A&quo ...

  2. HashSet中是如何判断元素是否重复的

    HashSet不能添加重复的元素,当调用add(Object)方法时候, 首先会调用Object的hashCode方法判hashCode是否已经存在,如不存在则直接插入元素: 如果已存在则调用Obje ...

  3. java中Hashset集合删除元素_从Java中的HashSet中删除单个元素

    要从HashSet中删除单个元素,请使用remove()方法. 首先,创建一个HashSet-HashSet hs = new HashSet(); 现在,将元素添加到HashSet-hs.add(& ...

  4. HashSet中的add()方法( 五 )(详尽版)

    上接 HashSet中的add()方法( 四 )(详尽版) ,我们再重写一下equals()方法来看看是否可以不能存入相同的id: 在学生类中再重写equals()方法: public class S ...

  5. HashSet中的add()方法( 四 )(详尽版)

    上接 HashSet中的add()方法( 三 )(详尽版) ,我们重写一下Student类中的hashCode()方法来看看是否还能不能添加重复的学号了, 在学生类中重写hashCode()方法: p ...

  6. LeetCode.961-2N数组中N次重复的元素(N-Repeated Element in Size 2N Array)

    这是悦乐书的第365次更新,第393篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第227题(顺位题号是961).在大小为2N的数组A中,存在N+1个唯一元素,并且这些元 ...

  7. js删除两个集合中共同元素_多个集合中的共同和独特元素

    js删除两个集合中共同元素 本周,我们将暂时中断较高级别的问题和技术文章,以解决我们中许多人可能面临的一些代码问题. 没什么花哨的或太辛苦的,但是有一天它可能会节省您15分钟的时间,偶尔回到基础上也很 ...

  8. 多个集合中的共同和独特元素

    本周,我们将暂时中断较高级别的问题和技术文章,以解决我们中许多人可能面临的一些代码问题. 没什么花哨的或太辛苦的,但是有一天它可能会节省您15分钟的时间,偶尔回到基础上也很不错. 因此,让我们开始吧. ...

  9. HashSet子类依靠()方法区分重复元素

    HashSet类,是存在于java.util包中的类 [1] .同时也被称为集合,该容器中只能存储不重复的对象, 已知实现接口有: Serializable, Cloneable, Iterable, ...

最新文章

  1. 成本管理系统开源_开源教科书如何降低大学成本
  2. Educational Codeforces Round 12 C. Simple Strings 贪心
  3. UltraISO软碟通U盘安装Centos7 的各种报错及解决方案
  4. 网络:HTTP报文格式
  5. android源生setting华为,Android 设置默认桌面,默认应用,辅助功能,电池优化,设备管理器,悬浮窗等...
  6. php 判断update返回为0_PHP进行数据库更新update操作,返回状态
  7. readfile函数使用方法_1分钟学会LOOKUP函数,有网友说使用这个方法,初学者秒变大神...
  8. 【转】彻底删除打印机
  9. android禁止wifi,android – 防止WiFi-direct在不使用时关闭
  10. Lammps:Python上Ovito模块配置的问题与解决
  11. Java之XML转Json
  12. easyui的datagrid可编辑框小功能实例
  13. android 名片识别软件,手机名片识别工具Android名片全能王评测
  14. 好用的Web前端开发框架有哪些呢?推荐这9款
  15. 什么是拦截器?什么是过滤器?
  16. 刚性方程组的mma求解
  17. 计算机等级应用考试种类是什么,优·计算机等级考试分类练习题.doc
  18. 支持爱普生r330的打印服务器,软件让照片打印更专业_爱普生 R330_办公打印评测试用-中关村在线...
  19. 电路与模拟电子技术----正弦交流电路(上)
  20. 数据结构--------顺序存储

热门文章

  1. php mysql 绕过_PHP中md5绕过
  2. Nexus 3.31.1 maven 私服 搭建篇 linux
  3. flowable6.4.2流程审批后涉及到的表
  4. gb-heima/order 项目 处理
  5. javaScript PC端网页特效
  6. mysql查询包含字符串(模糊查询)
  7. php原生态三级联动_ajax php实现三级联动的方法
  8. 两台邮件服务器共用一个公网地址,两个不同域邮件服务器的互通
  9. java配置jndi连接数_JavaWeb:Tomcat下配置数据源(JNDI)连接数据库 | 学步园
  10. 关于指针释放的小领悟