`
NicholasBugs
  • 浏览: 51797 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

Set中如何保证元素的唯一性

    博客分类:
  • Java
 
阅读更多
在Set里如果保证其中元素的唯一型:
我们来看看 Set的一个实现HashSet中的add方法,HashSet内部使用一个HashMap来存放对象,
HashSet把要保存的对象做为其内部HashMap的key,如下:
//PRESENT为一个辅助的Object型对象
public boolean add(E o) {
	return map.put(o, PRESENT)==null;
    }
如果有两个对象A,B, A.equals(B)返回ture,则
A和B只会有一个被保存在set中。
在HashMap中判断两个key相同的逻辑是 hashcode()相等并且 equals()返回true。

再看看HashMap中的put()
public V put(K key, V value) {
	if (key == null)
	    return putForNullKey(value);
        int hash = hash(key.hashCode());
        int i = indexFor(hash, table.length);
        for (Entry e = table[i]; e != null; e = e.next) {
            Object k;
            /**
            * 因为A.equals(B)为true,故A.hashCode() == B.hashCode();
            * 故会进入到下面的if块内部,从而保证了A和B只有一个被保存在Set里
            */    
        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;
    }


刚好看到另外一个帖子,http://www.iteye.com/topic/123202
if (e.hash == hash && ((k = e.key) == key || key.equals(k))) 中,只有hashcode相等时
才会调用后面的key.equals(k)
分享到:
评论

相关推荐

    C++set函数学习

    set由于保证元素唯一性,适用于只需要存储不重复单词的场景;而multiset适用于需要统计每个单词出现次数的情况。例题要求输出排序后的单词列表,并且重复的单词只输出一次,set正适合这种情况。 在编程实践中,set...

    java中设置登录名的唯一性

    在Java编程中,确保登录名或用户名的唯一性是一项关键任务,这通常涉及到数据库操作、数据验证和数据存储策略。以下是一些关于如何在Java中实现登录名唯一性的详细知识点: 1. 数据库约束:首先,数据库是实现唯一...

    对Java中Set的深入研究.pdf

    - 根据JavaDoc,Set确保元素唯一性的依据是:没有两个元素e1和e2满足e1.equals(e2),并且最多只能有一个null元素。 - `TreeSet`和`HashSet`利用了Map的特性来确保元素唯一性。它们将Set中的元素作为Map的键,因为...

    map和set的异同

    - `set`:不允许插入相同的元素,确保了集合中元素的唯一性。 3. **访问方式**: - `map`:通过键访问值。 - `set`:只能通过迭代器访问元素。 4. **应用场景**: - `map`:适合用于需要通过键快速查找值的...

    Java中Set的深入研究

    `HashSet`使用对象的`hashCode()`和`equals()`方法来确保元素的唯一性。当向`HashSet`中添加一个新元素时,首先会计算该元素的哈希码,然后将元素放置到哈希表的适当位置。如果两个元素的`equals()`方法返回`true`,...

    对Java中Set的深入研究

    `Set`接口属于Java集合框架的一部分,继承自`Collection`接口,并在此基础上增加了对元素唯一性的限制。本篇文章将详细介绍`Set`接口的实现机制及其内部工作原理,包括如何判断元素是否重复、不同类型的`Set`实现类...

    STL中set用法详解.docx

    如果尝试插入已存在的元素,set会忽略该操作,保持元素的唯一性。 2. **遍历元素**:可以使用迭代器来遍历set中的元素,例如: ```cpp for (set<int>::iterator set_iter = eg1.begin(); set_iter != eg1.end();...

    Set用法及与List的区别

    Set是一个不允许有重复元素的集合,它遵循唯一性原则。在Set接口下有许多实现类,如HashSet、TreeSet和LinkedHashSet等。我们以`HashSetDemo.java`为例,探讨HashSet的使用方法。 `HashSet`是Java中最常用的Set实现...

    JavaSE专题-Set集合.doc

    在使用HashSet时,需要注意的是,需要重写hashcode和equals方法,以确保元素的唯一性。如果hashcode返回的结果都一样,可以吗?答案是不能,因为那样的话,HashSet将无法保证元素的唯一性。 TreeSet TreeSet是Set...

    java集合知识-map、set等

    如何保证该集合的元素唯一性呢? 是通过对象的hashCode和equals方法来完成对象唯一性的。 如果对象的hashCode值不同,那么不用判断equals方法,就直接存储到哈希表中。 如果对象的hashCode值相同,那么要再次...

    C++ 集合 set 例子

    - **唯一性**:`set`不允许重复元素,尝试插入重复元素时,操作会被忽略。 - **非随机访问**:由于其实现方式,`set`不支持随机访问,只能通过迭代器进行顺序访问。 ### `set`的函数列表 #### 基本操作 - **begin...

    List和Set使用retainAll方法的比较

    它不支持索引访问,但提供了一种唯一性保证。常见的Set实现类有HashSet和TreeSet。 2. **retainAll方法的实现原理** - 对于`List`,`retainAll`方法的实现通常是遍历整个列表,对于每个元素,检查它是否存在于指定...

    CSet源代码,集合类的C++源代码

    1. **类设计**:`CSet`的内部结构设计,比如它是基于哪种数据结构实现的,以及这个数据结构是如何维护元素唯一性的。 2. **内存管理**:如果`CSet`存储的是指针或者对象,那么它如何处理内存分配和释放,以防止内存...

    java中set接口使用方法详解

    在Java编程中,Set接口是集合框架的一部分,它...在使用Set时,确保正确实现或提供比较规则,以保证元素的唯一性和排序的准确性。同时,注意Set接口不支持重复元素,这在处理数据去重或构建唯一标识集合时特别有用。

    Java应用:两种Java容器类List和Set分析

    ### Java应用:两种Java容器类List和Set分析 ...而在需要保证元素唯一性时,则应该使用`Set`。此外,根据具体的需求和性能考虑,还可以进一步选择`ArrayList`、`LinkedList`或者`HashSet`、`TreeSet`等具体的实现类。

    STL_set.rar_stl set

    - 唯一性:`set`不允许重复元素,所以当你试图插入一个已经存在的元素时,插入操作将被忽略。 - 排序:`set`中的元素总是保持排序状态,插入新元素时会自动调整顺序。 这个压缩包中的"STL_set"可能包含了关于如何...

    java中三种集合set、map、list的区别与联系

    `Set`则确保元素唯一,不关心元素的插入顺序。 在选择使用哪种集合时,应考虑以下因素: - **数据是否需要唯一性**:如果需要存储唯一的元素,应选择`Set`。 - **数据是否需要排序**:如果需要排序,可以选择`...

    java 运用集的相关类(Set)

    Set接口继承自Collection接口,其主要特性是元素的唯一性,即不允许有重复的元素。Set接口没有定义任何特定的存储行为,具体的行为由它的实现类来决定。Java提供了多种Set接口的实现,如HashSet、TreeSet和...

    set接口经常用的hashCode和equals方法详解

    为了确保元素的唯一性,`Set`接口依赖于对象的`hashCode`和`equals`方法。本文将深入探讨这两个方法在`Set`接口中的作用及其背后的原理。 #### 二、`Set`接口简介 `Set`接口是一种不允许包含重复元素的集合。根据...

Global site tag (gtag.js) - Google Analytics