`
deepnighttwo
  • 浏览: 53954 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

HashSet的contains方法

 
阅读更多
关于HashSet的发现:
1:HashSet是一个Set,也就是所谓的集合。集合的概念是元素在集合中无序、唯一。无序对于计算机来说没有什么意义,因为计算机总要按照一定的顺序存储对象。唯一是怎么实现的呢?名字上说的已经很清楚了。HashSet,就是通过其中的元素(对象)的hashconde来区分对象是否唯一的。所以,HashSet的对象中着一个集合中对象的hashcode的list,每次执行set.add(obj)的时候,都会取出obj的hashcode与其内部的list进行比较,如果没有与之相等的,就加进set里去,同时把那个obj的hashcode加到list里面去;如果有相等的,就再调用obj的equals方法与各个对象进行比较,如果没有相等的,就加入到set里面去,如果还有相等的,就不执行加入操作。
public Set add(Object obj){
int code = obj.hashCode();
if(code not in this.hashcodeList){//如果没有于之相等的hashcode。就将obj加入
this.valueList.add(obj);
this.hashcodeList.add(code);
return true;
}else{//否则看看是否有与之equals相等的。
if(code in this.valueList){//有,add失败
return false;
}else{//没有,add成功
this.valueList.add(obj);
return true;
}
}
}
其实相当于执行了一次contains方法,根据contains方法的返回值决定是否真的add。
也就是说HashSet在确定已经包含某个对象相等的标准是:它们的hashcode相等或者它们的equals方法返回true。
郁闷了半天,怎么先比较hashcode呢?
总算知道了为什么覆盖了toString()后不覆盖hashcode(),Eclipse会给出警告。原来这两个都和对象的相等比较有关系啊。Object的hashcode就是根据对象的内存地址计算出了,保证不重复。而String的hashcode就不一样了,只要字符串的内容相等(equals返回true),它们的hashcode就是相等的。
特别需要注意的是HashSet是有缓存的,第一次contains执行完后会缓存所有的hashcode,以后再调用contains比较的时候使用缓存的hashcode(就是那个list),所以说HashSet最好只用来存储不可变对象,否则contains方法的返回值是不准确的。
一下原则要记住:
1:对于不可变类(String、Integer、以及自己定义的不可变类等),要保证equals返回true的时候,它们的hashcode的值相等。
2:对于不可变类,也要尽量满足1。以避免出现上面说的Set比较时出现的问题。
3:覆盖一个类的equals方法的时候,要注意可交换性,要保证a.equals(b)的值一定等于b.equals(a)的数值。
分享到:
评论

相关推荐

    hashset类的使用

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

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

    此方法的实现代码较为简洁,但缺点是 HashSet 会自动排序,这样新集合的数据排序就和原集合不一致了 4:TreeSet去重(无序) 比较遗憾的是,TreeSet 虽然实现起来也比较简单,但它有着和 HashSet 一样的问题,会自动...

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

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

    集合类HashSet

    然后,通过HashSet的contains()方法查找对象;最后,如果找到了该对象,就可以直接调用其方法。例如: ```java HashSet<MyObject> set = new HashSet(); MyObject obj = new MyObject(); set.add(obj); if (set....

    Java中ArrayList的removeAll方法详解

    接着,我们使用迭代器遍历LinkedList中的元素,然后使用HashSet的contains方法判断该元素是否在HashSet中。如果在,则删除该元素。最后,我们返回处理后的ArrayList。 5. 比较两种实现方式 在比较两种实现方式时,...

    c++用vector实现HashSet

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

    java 利用HashSet删除学生

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

    Java中HashSet的解读_.docx

    HashSet的主要操作,如添加元素(add)、删除元素(remove)、检查元素是否存在(contains)等,都直接委托给了HashMap。例如,`add()`方法实质上是调用了HashMap的`put()`方法,如果元素不在HashSet中,`put()`会...

    ThinkinginJava之Set接口、HashSet源码学习.pdf

    - **查询元素**:contains方法通过哈希码快速定位元素,如果找到则返回true,否则返回false。 - **其他方法**:addAll、retainAll、removeAll和clear等方法都是通过HashMap的相应方法来实现的,以保持元素唯一性。 ...

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

    4. HashSet的其他方法:HashSet的其他方法,如contains、remove、size等,都是通过调用HashMap的对应方法来实现的。 5. HashSet的实现机理:HashSet的实现机理可以总结为:HashSet是基于HashMap实现的,HashSet的...

    C# 有关List<T>的Contains与Equals方法.doc

    本文主要关注 `List<T>` 的两个关键方法:`Contains()` 和 `Equals()`,以及它们在处理集合比较和去重时的作用。 `Contains()` 方法: 此方法用于判断 `List<T>` 是否包含指定的元素。它接受一个参数 `T`,即列表中...

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

    HashSet的主要API包括add、clear、clone、contains、isEmpty、iterator、remove、size等方法。这些方法的作用是对HashSet对象进行操作,如添加元素、清空集合、克隆集合、判断元素是否存在、判断集合是否为空、获取...

    深入arraylist,linkedlist,hashmap,hashset源码(2012/3/18)

    `add()`、`contains()`和`remove()`方法是HashSet的关键,它们的行为与HashMap的相应方法紧密相关。 至于"Hashmap同步问题",在多线程环境下,如果不进行适当的同步控制,HashMap不是线程安全的。这意味着在并发...

    第8天(集合【LinkedList、HashSet、Collection集合体系】)v201703103

    \n - **HashSet存储自定义元素**:HashSet可以存储任何类型的对象,包括自定义对象,但要求对象必须实现`hashCode()`和`equals()`方法,以便于计算哈希码并判断元素唯一性。\n\n4. **判断集合元素唯一性原理**\n 在...

    实例讲解Java HashSet

    HashSet 类提供了很多有用的方法,添加元素可以使用 add() 方法。例如: ```java import java.util.HashSet; public class RunoobTest { public static void main(String[] args) { HashSet<String> sites = new...

    顺序表删除重复元素java.docx

    3. **contains方法**:在for-each循环中,使用ArrayList的contains方法检查元素是否已存在于uniqueList中。contains方法返回布尔值,如果列表包含指定的元素,则返回true,否则返回false。 4. **clear与addAll方法*...

    HashTable、HashSet和Dictionary的区别点总结

    HashSet的常用方法包括: * Add(item):添加一个元素 * Remove(item):删除一个元素 * Clear():清除所有元素 * Contains(item):判断是否包含特定元素 三、Dictionary Dictionary表示键和值的集合。Dictionary, ...

    Java HashSet

    2. **判断元素存在**:使用 `contains()` 方法检查给定的对象是否存在于 `HashSet` 中,返回 `true` 或 `false`。 3. **删除元素**:使用 `remove()` 方法删除指定元素。如果元素存在,返回 `true`,否则返回 `false...

    java集合类源码分析之Set详解.docx

    - `contains(Object o)`:判断集合是否包含指定元素,通过调用HashMap的`containsKey()`方法实现。 4. 删除元素: - `remove(Object o)`:删除指定元素,调用HashMap的`remove()`方法,返回值表示操作是否成功。 ...

    java 如何使用charAt()方法计算重复字符

    if (occurredChars.contains(c)) { System.out.println("字符 '" + c + "' 重复"); } else { occurredChars.add(c); } } } } ``` 这段代码会输出所有重复的字符。 5. **注意事项**: - 字符串中的中文...

Global site tag (gtag.js) - Google Analytics