1. HashSet概述:
HashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持。它不保证set 的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用null元素。
2. HashSet的实现:
对于HashSet而言,它是基于HashMap实现的,HashSet底层使用HashMap来保存所有元素,因此HashSet 的实现比较简单,相关HashSet的操作,基本上都是直接调用底层HashMap的相关方法来完成,我们应该为保存到HashSet中的对象覆盖hashCode()和equals(),因为再将对象加入到HashSet中时,会首先调用hashCode方法计算出对象的hash值,接着根据此hash值调用HashMap中的hash方法,得到的值& (length-1)得到该对象在hashMap的transient Entry[] table中的保存位置的索引,接着找到数组中该索引位置保存的对象,并调用equals方法比较这两个对象是否相等,如果相等则不添加,如果不等,则添加到该数组索引对应的链表中。
------------------------------------------------------------------------------------------
Set的实现类的集合对象中不能够有重复元素,HashSet也一样他是使用了一种标识来确定元素的不重复,HashSet用一种算法来保证HashSet中的元素是不重复的, HashSet采用哈希算法,底层用数组存储数据。默认初始化容量16,加载因子0.75
Object类中的hashCode()的方法是所有子类都会继承这个方法,这个方法会用Hash算法算出一个Hash(哈希)码值返回,HashSet会用Hash码值去和数组长度取模, 模(这个模就是对象要存放在数组中的位置)相同时才会判断数组中的元素和要加入的对象的内容是否相同,如果不同才会添加进去。
Hash算法是一种散列算法。
Set hs=new HashSet();
hs.add(o);
|
o.hashCode();
|
o%当前总容量 (0--15)
|
| 不发生冲突
是否发生冲突-----------------直接存放
|
| 发生冲突
| 假(不相等)
o1.equals(o2)-------------------找一个空位添加
|
| 是(相等)
不添加
覆盖hashCode()方法的原则:
1、一定要让那些我们认为相同的对象返回相同的hashCode值
2、尽量让那些我们认为不同的对象返回不同的hashCode值,否则,就会增加冲突的概率。
3、尽量的让hashCode值散列开(两值用异或运算可使结果的范围更广)
注意:所以要存入HashSet的集合对象中的自定义类必须覆盖hashCode(),equals()两个方法,才能保证集合中元素不重复。在覆盖equals()和hashCode()方法时, 要使相同对象的hashCode()方法返回相同值,覆盖equals()方法再判断其内容。为了保证效率,所以在覆盖hashCode()方法时, 也要尽量使不同对象尽量返回不同的Hash码值。
如果数组中的元素和要加入的对象的hashCode()返回了相同的Hash值(相同对象),才会用equals()方法来判断两个对象的内容是否相同。
------------------------------------------------------------------------------------------
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<E,Object>();
-
}
-
-
-
-
-
-
-
-
-
public HashSet(Collection<? extends E> c) {
-
map = new HashMap<E,Object>(Math.max((int) (c.size()/.75f) + 1, 16));
-
addAll(c);
-
}
-
-
-
-
-
-
-
-
-
public HashSet(int initialCapacity, float loadFactor) {
-
map = new HashMap<E,Object>(initialCapacity, loadFactor);
-
}
-
-
-
-
-
-
-
-
public HashSet(int initialCapacity) {
-
map = new HashMap<E,Object>(initialCapacity);
-
}
-
-
-
-
-
-
-
-
-
-
-
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
-
map = new LinkedHashMap<E,Object>(initialCapacity, loadFactor);
-
}
-
-
-
-
-
-
-
-
-
-
public Iterator<E> iterator() {
-
return map.keySet().iterator();
-
}
-
-
-
-
-
-
-
-
public int size() {
-
return map.size();
-
}
-
-
-
-
-
-
-
-
public boolean isEmpty() {
-
return map.isEmpty();
-
}
-
-
-
-
-
-
-
-
-
-
-
public boolean contains(Object o) {
-
return map.containsKey(o);
-
}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
public boolean add(E e) {
-
return map.put(e, PRESENT)==null;
-
}
-
-
-
-
-
-
-
-
-
-
-
-
public boolean remove(Object o) {
-
return map.remove(o)==PRESENT;
-
}
-
-
-
-
-
-
-
public void clear() {
-
map.clear();
-
}
-
-
-
-
-
<span
分享到:
相关推荐
源码解析jdk7.0集合:HashSet的底层实现原理.pdf
ava基础 基础知识 面向对象基础 Java基本数据类型 string和包装类 final关键字特性 Java类和包 抽象类和接口 代码块和代码执行顺序 Java自动拆箱装箱里隐藏的秘密 ...Java集合详解8:Java集合类细节精讲 JavaWeb
HashSet 是 Java 中的一个集合类,它实现了 Set 接口并提供了基于哈希表的无序、不重复元素的集合。具体来说,它是通过哈希表(实际上是一个 HashMap 实例)来存储元素的。 以下是 HashSet 的一些主要特点: 无序...
HashSet的实现原理 ,HashSet与HashMap的区别 以及 HashSet的底层实现方式
Java集合专题总结:HashMap 和 HashTable 源码学习和面试总结
主要介绍了Java面试题 从源码角度分析HashSet实现原理?,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
对于 HashSet 而言,它是基于 HashMap 实现的,HashSet 底层采用 HashMap 来保存所有元素,因此 HashSet 的实现比较简单,查看 HashSet 的源代码,可以看到如下代码:
java HashSet 集合排序,需要通过利用TreeSet集合排序。2013-10-30。
之所以把HashSet和HashMap放在一起讲解,是因为二者在Java里有着相同的实现,前者仅仅是对后者做了一层包装,也是说HashSet里面有一个HashMap(适配器模式)。因此本文将重点分析HashMap。 HashMap实现了Map...
离散数学作业:JAVA实现集合(用HashSet实现)及其运算(交集,并集,差集,判断是否包含某元素等)
主要介绍了Java面试题之HashSet的实现原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
主要介绍了通过实例学习Java集合框架HashSet,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
2)了解Set接口及主要实现类(HashSet、TreeSet) 3)了解List接口及主要实现类(ArrayList、LinkedList、Vector) 4)了解Map接口及主要实现类(HashMap、TreeMap、HashTable) 二、实验内容及步骤 1、编写程序...
hashSet底层去重原理
java集合类 Java中有哪些容器(集合类)? 线程安全和线程不安全的分别有哪些? Map接口有哪些实现类? 描述一下Map put的过程 如何得到一个线程安全的Map? HashMap有什么特点? ConcurrentHashMap是怎么分段分组...
Java Generics and Collections 英文版,详细描述java 泛型技术
Java基础加强_ArrayList_HashSet的比较及Hashcode分析
掌握List集合、Set集合、Map集合的使用以及Iterator迭代器和foreach循环的使用 了解常用的集合类 熟悉泛型的使用
掌握Java集合框架中的三大类集合的特征和适用场合 掌握ArrayList类的使用 掌握HashMap类的使用 了解HashSet类的使用 掌握Collections类的使用 了解集合框架中的其它集合类 集合框架(Collection Framework) java.util...
本文将对Java常见面试题进行总结和解析,旨在为准备面试的Java开发者提供全面而深入的学习参考。以下是一些关键的Java面试题目类别及其概述: Java集合框架:这部分问题关注ArrayList、LinkedList、HashMap、HashSet...