`

HashSet的contains方法de解释是不是有问题

阅读更多

first of all, exhibits the code:

 

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

public class Test {
	int value;

	Test(int value) {
		this.value = value;
	}

	public boolean equals(Object obj) {
		if (obj instanceof Test) {
			Test foo = (Test) obj;
			return value == foo.value;
		} else {
			return false;
		}
	}
	
	public static void main(String[] args) {
		ArrayList list = new ArrayList();
		HashSet set = new HashSet();
		list.add(new Test(1));
		set.add(new Test(1));
		
		Iterator i = set.iterator();
		while (i.hasNext()) {
			Test temp = (Test) i.next();
			System.out.println(temp.equals(new Test(1)));
		}
		
		System.out.println(list.contains(new Test(1)) + ","
				+ set.contains(new Test(1)));
		System.out.println(new Test(1).equals(new Test(1)) + ","
				+ set.contains(new Test(1)));
	}
}

 

about contains, why list is true while set is false?

 

 

my answer:

 

HashSet与ArrayList的contains算法多加入了hashCode的考量

看源码,HashSet的contains方法最终是通过HashMap中的:

 

/**
 * Returns the entry associated with the specified key in the
 * HashMap.  Returns null if the HashMap contains no mapping
 * for the key.
 */
final Entry <K,V> getEntry(Object key) {
    int hash = (key == null) ? 0 : hash(key.hashCode());
    for (Entry <K,V> e = table[indexFor(hash, table.length)]; e != null; e = e.next) {
        Object k;
        if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k))))
            return e;
    }
    return null;
} 

 可见,hash和equals方法都是介入因素

但这里奇怪ArrayList和HashSet的contains方法javadoc一模一样,分别是:
Returns true if this list contains the specified element. More formally, returns true if and only if this list contains at least one element e such that (o==null ? e==null : o.equals(e)).

Returns true if this set contains the specified element. More formally, returns true if and only if this set contains an element e such that (o==null ? e==null : o.equals(e)).
开始真是迷惑了一下,若我没考虑错的话,HashSet的解释是否是漏写了hash的相关

若要相同,是否在Test类中再重写hashCode如:

public int hashCode() {
    return value;
}
 

 

分享到:
评论

相关推荐

    hashset类的使用

    然后使用contains方法检查HashSet中是否包含特定字符串。我们还演示了remove方法来删除一个元素,使用size方法获取了HashSet中元素的数量,并最终使用迭代器遍历了HashSet中的所有元素。 在实际应用中,HashSet因其...

    HashSet类的用法.pdf

    可以使用`isEmpty()`方法检查`HashSet`是否为空。 ```java if (hs.isEmpty()) { System.out.println("HashSet是空的"); } else { System.out.println("HashSet不是空的"); } ``` 7. **获取元素数量** `...

    HashSet的实现原理

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

    HashSet去重

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

    List 去重的6种方法(contains、迭代、hashSet、treeSet、linkedHashSet、stream)

    比较遗憾的是,TreeSet 虽然实现起来也比较简单,但它有着和 HashSet 一样的问题,会自动排序 5:LinkedHashSet去重(有序) 从代码和执行结果可以看出,LinkedHashSet 是到目前为止,实现比较简单,且最终生成的新...

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

    - `contains(Object object)`:判断HashSet是否包含指定的元素。 - `isEmpty()`:检查HashSet是否为空。 - `iterator()`:返回一个迭代器,用于遍历HashSet的元素。 - `remove(Object object)`:移除HashSet中指定的...

    集合类HashSet

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

    c++用vector实现HashSet

    在C++编程中,HashSet是一种常用的集合数据结构,它提供了存储唯一对象的功能,类似于Java中的HashSet。虽然C++标准库中没有直接提供HashSet类,但我们可以利用其他容器,如`std::unordered_set`来实现类似的功能。...

    HashMap与HashTable和HashSet的区别

    综上所述,`HashTable`、`HashMap`和`HashSet`各有其特点和适用场景: - 如果需要线程安全,并且不允许`key`或`value`为`null`,则应选择`HashTable`。 - 如果不要求线程安全,并且希望支持`null`值或`null`键,则...

    java HashSet 集合排序

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

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

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

    treemap treeset hashset hashmap 简要介绍

    综上所述,选择`TreeMap`、`TreeSet`、`HashSet`还是`HashMap`,主要取决于具体的应用需求,比如是否需要保持元素的排序,是否允许重复元素,以及对插入、删除和查找操作速度的要求。正确理解并使用这些集合类,可以...

    hashSet底层去重原理.xmind

    hashSet底层去重原理

    java 利用HashSet删除学生

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

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

    HashSet的构造方法还允许从一个已有的Collection集合中创建HashSet对象。此时,构造函数会遍历Collection中的所有元素,并添加到新的HashSet中。这个过程实际上是在内部的HashMap中进行的。 对于HashSet中常见的...

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

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

    排序之HashSet和TreeSet的区别

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

    Java中ArrayList的removeAll方法详解

    为了优化removeAll方法的性能,可以使用迭代器遍历ArrayList中的元素,然后使用HashSet的contains方法判断该元素是否在另外一个集合中。如果在,则删除该元素。这种实现机制的时间复杂度为O(m),far less than O(m*n...

    集合的概念及应用和HashSet保证数据不重复的原理

    如果已有元素占据了这个位置,那么会调用equals()方法来判断新元素是否与已存在元素相等。如果equals()返回true,表示元素已经存在,HashSet就不会添加新的元素,从而保证了数据的唯一性。 源码分析是理解这些概念...

Global site tag (gtag.js) - Google Analytics