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
分享到:
相关推荐
"深入Java集合学习系列:HashSet的实现原理 - 莫等闲 - ITeye技术网站.mht"会讲解HashSet如何避免元素重复以及它的性能特点。 最后,LinkedHashSet结合了HashSet的特性与LinkedHashMap的顺序特性,它维护了元素的...
Java集合详解1:一文读懂ArrayList,Vector与Stack使用方法和实现原理 Java集合详解2:Queue和LinkedList Java集合详解3:Iterator,fail-fast机制与比较器 Java集合详解4:HashMap和HashTable Java集合详解5:深入...
本文将深入探讨Java集合框架的核心概念,包括List、Set、Map等接口,以及ArrayList、LinkedList、HashSet、HashMap等实现类,帮助你理解和解决面试中的相关问题。 1. **List和Set的区别及应用场景** - **List** 是...
内容概要:本文详细介绍了Java集合框架的重要性和在Android开发中的应用。首先,阐述了集合框架的基本概念,包括接口(Collection、Set、List、Map)和其实现类(ArrayList、LinkedList、HashSet、TreeSet、HashMap...
Java集合框架是Java编程语言中的一个核心部分,它为数据结构和对象的存储、管理和操作提供了统一的接口和实现。这个框架包括了多种类型的集合,如List、Set、Queue和Map,以及它们的各种实现类,如ArrayList、...
首先,Java集合框架由一系列接口和实现这些接口的类组成。主要的接口有`List`、`Set`和`Queue`,它们各自代表了不同特性的数据结构。`List`接口定义了一个有序的、允许重复元素的集合,如`ArrayList`和`LinkedList`...
这些示例有助于理解JAVA集合框架的内部工作原理,以及如何有效地存储和操作数据。 5. **输入/输出流**:展示了JAVA I/O流的概念,包括文件读写、对象序列化和反序列化、缓冲区流等。这些代码有助于理解数据的输入...
本指南将深入探讨HashMap、HashSet、HashTable、LinkedHashMap、LinkedHashSet、ArrayList、LinkedList、ConcurrentHashMap等主要集合类的实现原理,以及它们在实际应用中的选择与比较。 首先,HashMap是最常用的...
本文旨在深入剖析Java集合API的核心概念及其应用场景,帮助读者全面理解其背后的原理与设计模式。 #### 二、Java集合API概述 Java集合API是一系列用于存储和操作对象集合的接口和类的集合。这些集合被设计成可复用...
在Java编程语言中,集合类是用于存储一组...在黑马程序员_毕向东_Java基础视频教程中,你可能会更详细地学习到关于HashSet的实现原理和实战技巧。通过观看相关视频和实践操作,可以加深对HashSet的理解,提升编程能力。
通过以上内容的介绍,读者应能更深入地理解Java集合框架中的Set接口及其各种实现的内部原理,并掌握如何在Java编程中使用这些集合来解决实际问题。同时,还应该对并发集合类有所了解,以及如何在多线程环境下安全地...
"Java学习路线图:Java应知应会的300个问题.rar"这个压缩包文件,很可能包含了从基础到高级的Java知识点,旨在帮助你构建一个全面的学习路径。 首先,我们来讨论Java的基础部分。这通常包括Java语法、数据类型、...
3. **集合框架**:Java的集合框架包括List、Set、Map等接口和ArrayList、HashSet、HashMap等实现类,它们是存储和操作数据的重要工具。 4. **多线程**:Java提供了内置的多线程支持,使得开发者可以编写并发应用...
首先,Java集合框架主要包括接口和实现这些接口的类。接口如`List`, `Set`, `Queue`, `Map`等,定义了集合的行为和操作。而`ArrayList`, `LinkedList`, `HashSet`, `TreeSet`, `HashMap`, `LinkedHashMap`等则是具体...
本文将对Java集合框架的源码进行分析,深入探讨其实现原理和机制。 一、LinkedList源码分析 LinkedList是一种以双向链表实现的List,它除了作为List使用,还可以作为队列或者栈来使用。它实现了List、Queue和Deque...
Java集合框架是Java编程语言中用于操作和管理对象集合的核心部分,它提供了一系列的接口和实现类,用于高效地处理各种数据结构。本篇文章将详细探讨Java集合框架的各个方面,包括其核心概念、主要接口、实现原理以及...
以下是对Java集合学习的一些关键知识点的详细解释: 一、集合接口 1. `List`: 有序的集合,允许重复元素,保持插入顺序。常见的实现类有ArrayList和LinkedList。 2. `Set`: 不包含重复元素的集合,不保证元素顺序。...
集合是Java编程中的一种核心概念,它是一种存储和管理对象的方式。在Java中,集合框架是Java.util包下的一个子集,提供了各种不同类型的集合...同时,合理利用工具可以提高开发效率,使我们能更好地驾驭Java集合框架。