`

探究HashSet的add方法机理

阅读更多
HashSet 是一个Set,也就是所谓的集合。集合的概念是元素在集合中无序、唯一。无序对于计算机来说没有什么意义,因为计算机总要按照一定的顺序存储对象。它不保证集合的迭代顺序;唯一是怎么实现的呢?名字上说的已经很清楚了。HashSet,就是通过其中的元素(对象)的hashconde来区分对象是否唯一的。所以,HashSet的对象中维护着一个集合中所有对象的hashcode的list,每次执行set.add(obj)的时候,都会取出obj的hashcode与其内部的list进行比较,如果list中不存在与之相等的值,就加到set里去,同时把那个obj的hashcode加到list里去;如果有相等的,接着调用obj的equals方法与集合中各个对象进行比较,如果都返回false,就加入到set里面去,反之就不执行加入操作。
/**
 * 
 */
package thread;

import java.util.ArrayList;
import java.util.Iterator;

/**
 * @author chunfeng.zhu
 * 
 * 2008-7-16-下午03:46:01
 */
public class TestAdd {

	ArrayList hashcodeList = new ArrayList();
	ArrayList valueList = new ArrayList();

	/**
	 * 
	 */
	public TestAdd() {
		// TODO Auto-generated constructor stub
	}

	private boolean add(final Object object) {
		int hashcode = object.hashCode();
		if (!hashcodeList.contains(hashcode)) {// 如果hashcode不存在
			hashcodeList.add(hashcode);
			valueList.add(object);
			return true;
		} else {
			// 依次比较各个现有对象是否与object equals
			for (Iterator iterator = valueList.iterator(); iterator.hasNext();) {
				Object tempObject = (Object) iterator.next();
				if (object.equals(tempObject)) {
					return false; // equals的话直接返回为false
				}
			}// 找不到equals的话,加入list
			valueList.add(object);
			return true;
		}
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

	}

}

1
0
分享到:
评论
2 楼 longxiaoyan 2010-04-14  
是这样吗?如果HashSet的对象中维护着一个集合中所有对象的hashcode的list,那和没有使用hashcode的效率有什么差别啊?使用hashcode就是为了快速定位对象位置的,好像不需要遍历list吧。
1 楼 gnomewarlock 2008-08-26  
很透彻 顶你一下

相关推荐

    hashset类的使用

    上面的示例程序创建了一个HashSet对象,并通过add方法添加了几个字符串元素。然后使用contains方法检查HashSet中是否包含特定字符串。我们还演示了remove方法来删除一个元素,使用size方法获取了HashSet中元素的数量...

    HashSet类的用法.pdf

    使用`add()`方法向`HashSet`中添加元素。由于`HashSet`不允许重复元素,因此尝试添加已存在的元素将不会改变`HashSet`的状态,且返回`false`。 ```java hs.add("第一个元素"); ``` 3. **从列表中添加元素** ...

    HashSet去重

    - **`equals`方法的作用**:当两个对象的`hashCode`相同时,`HashSet`会调用这两个对象的`equals`方法来最终确定是否为同一个对象。 - **效率问题**:对于大量数据而言,`HashSet`的效率非常高。哈希表通过`hashCode...

    HashSet的实现原理

    这种实现方式让HashSet的操作非常简单高效,因为HashSet的大部分操作,包括添加元素、删除元素、检查元素是否存在等,都是直接调用HashMap的相关方法来完成的。 首先,我们来详细了解一下HashSet的基本概念和结构。...

    Java面试题 从源码角度分析HashSet实现原理

    5. HashSet的实现机理:HashSet的实现机理可以总结为:HashSet是基于HashMap实现的,HashSet的元素不重复机制是通过HashMap的put方法实现的,HashSet的其他方法都是通过调用HashMap的对应方法来实现的。 通过源码...

    HashSet详解和使用示例_动力节点Java学院整理

    - `add(E object)`:将指定的元素添加到HashSet中,如果集合已经包含该元素,返回false。 - `clear()`:移除HashSet中的所有元素。 - `clone()`:返回HashSet的一个浅复制。 - `contains(Object object)`:判断...

    源码解析jdk7.0集合:HashSet的底层实现原理.pdf

    在HashSet中,当调用add()方法时,它会检查新元素的hashCode()值,如果该值对应的HashMap位置上已经存在元素,则再调用equals()方法来判断是否真正重复。如果equals()方法返回true,则说明当前元素与已存在元素相等...

    集合类HashSet

    HashSet提供了多种操作方法,如add()用于添加元素,remove()用于删除元素,contains()用于检查元素是否存在,size()返回集合中元素的数量,isEmpty()判断集合是否为空。此外,HashSet还支持迭代器(Iterator),允许...

    HashMap与HashTable和HashSet的区别

    - **线程安全性**:`HashTable`的所有方法都是同步的,因此它是线程安全的。 - **初始容量和加载因子**:可以通过构造函数设置`HashTable`的初始容量和加载因子。默认情况下,加载因子为0.75,这是一个很好的平衡点...

    HashSet工作原理_动力节点Java学院整理

    对于 HashSet 而言,它是基于 HashMap 实现的,HashSet 底层采用 HashMap 来保存所有元素,因此 HashSet 的实现比较简单,查看 HashSet 的源代码,可以看到如下代码:

    java HashSet 集合排序

    java HashSet 集合排序,需要通过利用TreeSet集合排序。2013-10-30。

    hashSet底层去重原理.xmind

    hashSet底层去重原理

    treemap treeset hashset hashmap 简要介绍

    为了正确地工作,`HashSet`要求元素具有良好的`equals()`和`hashCode()`方法实现,以确保元素的唯一性和性能。`HashSet`的底层使用了`HashMap`,实际上,`HashSet`内部就是一个`HashMap`,其中所有值都被设置为`null...

    java 利用HashSet删除学生

    HashSet类提供了添加元素(add())、删除元素(remove())、检查元素是否存在(contains())等方法。在删除学生这个场景中,我们通常会有一个表示学生的类,例如`Student`,它包含一些属性如学号(id)、姓名(name...

    HashSet和TreeSet使用方法的区别解析

    * HashSet和TreeSet的使用方法和实现机理的区别 * hashCode()和equal()方法的实现和注意事项 * Comparable接口的使用和要求 * TreeSet中的Comparator的使用和要求 * HashSet和TreeSet的实际应用和选择依据

    Java基础加强_ArrayList_HashSet的比较及Hashcode分析

    当两个对象的Hashcode相同,HashSet会调用equals()方法进一步判断它们是否真的相等。 Hashcode是一个关键的概念,它是Java中的一个方法,用于将对象映射到一个整数值,通常用于哈希表的实现。每个对象都有一个唯一...

    排序之HashSet和TreeSet的区别

    在Java编程语言中,集合框架是处理数据的重要组成部分,其中`...同时,源码阅读也是提升技能的好方法,通过查看`HashSet`和`TreeSet`的源码,可以更深入地了解它们的工作原理,这有助于优化代码并解决可能出现的问题。

    Java中HashSet的解读_.docx

    例如,`add()`方法实质上是调用了HashMap的`put()`方法,如果元素不在HashSet中,`put()`会返回null,因此`add()`返回true表示添加成功。相反,`remove()`方法则是通过调用HashMap的`remove()`方法,如果返回的值...

    c++用vector实现HashSet

    在C++编程中,HashSet是一种常用的集合数据结构,它提供了存储唯一对象的功能,类似...这种方法虽然可能效率较低,但在某些特定场景下,例如教学、理解数据结构原理或者在资源有限的环境中,它可能会是一个有用的实践。

Global site tag (gtag.js) - Google Analytics