博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HashSet中实现不插入重复的元素
阅读量:6265 次
发布时间:2019-06-22

本文共 2758 字,大约阅读时间需要 9 分钟。

/*看一下部分的HashSet源码....public class HashSet
extends AbstractSet
implements Set
, Cloneable, java.io.Serializable{ static final long serialVersionUID = -5024744406713321676L; private transient HashMap
map; private static final Object PRESENT = new Object(); public HashSet() { map = new HashMap<>(); } public HashSet(Collection
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
iterator() { return map.keySet().iterator(); } public boolean add(E e) { return map.put(e, PRESENT)==null;//在下面的代码中我们可以看见map.put()的代码 }}public class HashMap
extends AbstractMap
implements Map
, 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
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
st = new HashSet
(); 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
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; }}

  

转载地址:http://gqdpa.baihongyu.com/

你可能感兴趣的文章
55.Azure内容分发网络(CDN)
查看>>
MySQL常见错误代码(error code)及代码说明
查看>>
微软MVP社区巡讲
查看>>
总结一下,MariaDB 10(MySQL5.6企业版分支)的主要新特性
查看>>
MS UC 2013-0-虚拟机-标准化-部署-2-模板机-制作-3-安装-Tool
查看>>
IDS与IPS的区别
查看>>
初试Windows 8 RTM
查看>>
Linux 下rpm包搭建LAMP环境
查看>>
Windows Server 2016-Nano Server介绍
查看>>
未来架构师的平台战略范例(4)_大数据
查看>>
Grizzly学习笔记(二)
查看>>
思科路由器动态VTI IPSec***配置
查看>>
***S启动时遇到1053错误
查看>>
CentOS7.5 使用 kubeadm 安装配置 Kubernetes1.12(四)
查看>>
shell脚本实现对系统的自动分区
查看>>
Tokyo Tyrant基本规范(5)--教程
查看>>
理解图形化执行计划 -- 第3部分:分析执行计划
查看>>
90后美女的全能测试蜕变之路
查看>>
audit.rules
查看>>
Windows 10企业批量部署实战之WDS配置
查看>>