美文网首页
HashSet深入

HashSet深入

作者: 李霖神谷 | 来源:发表于2017-04-13 20:19 被阅读13次
import java.util.HashSet;
import java.util.Iterator;

class R {
    int count;

    @Override
    public String toString() {
        return "R [count=" + count + "]";
    }

    public R(int count) {

        this.count = count;
    }

    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj != null && obj.getClass() == R.class) {
            R r = (R) obj;
            if (r.count == this.count) {
                return true;
            }
        }
        return false;
    }

    public int hashCode() {
        return this.count;
    }
}

public class JiHeDemo {
    public static void main(String[] args) {
        HashSet hs = new HashSet();
        hs.add(new R(5));
        hs.add(new R(4));
        hs.add(new R(3));
        System.out.println(hs);
        // 取第一个元素
        Iterator it = hs.iterator();
        R first = (R) it.next();
        first.count = 3;
        System.out.println(hs);
        hs.remove(new R(3));
        System.out.println(hs);
        System.out.println("是否包含count为3的对象" + hs.contains(new R(3)));
        System.out.println("是否包含count为5的对象" + hs.contains(new R(5)));
    }
}

当将第一个元素改为3时,集合中的一三元素完全相同,这表明这两个元素已经重复,但是HashSet把它们两个添加到不同的地方,因此HashSet完全可以容纳两个相同的元素。
此时HashSet比较混乱当试图删除count值为3的R 对象时,HashSet会计算出该对像的HashCode值从而找到该对象储存在HashSet中的位置,然后把此处的对象与count为3的R对象通过equals方法比较,如果相等,则删除该对像--HashSet只有第三个满足该条件(第一个元素hashCode值为5)。至于第一个count为3的对象,它保存在count为5的R对象对应的位置,但使equals方法拿它和count为5的R对象比较时返回的是false--这将导致HashSet不能准确的访问该元素。

相关文章

  • HashSet深入

    当将第一个元素改为3时,集合中的一三元素完全相同,这表明这两个元素已经重复,但是HashSet把它们两个添加到不同...

  • 深入理解HashSet

    题外话 今天下午去面试了一家公司,被问了一个问题,HashSet是因为什么保证元素可以不重复。感觉答的磕磕绊绊的,...

  • 深入了解HashSet

    我们知道Java中HashSet是Set的一个子类,其主要特点是存储的元素无序且不重复。这里先举个例子,来演示Ha...

  • HashSet实现原理分析(Java源码剖析)

    本文将深入讨论HashSet实现原理的源码细节。在分析源码之前,首先我们需要对HashSet有一个基本的理解。 H...

  • 深入Java基础(四)--哈希表(2)HashTable与Has

    又突然想看源码了,继续深入Java基础系列。今天是研究JavaAPI的HashTable和HashSet(顺带讨论...

  • java8中hashset源码分析

    分析大纲 hashset实现原理 hashset代码分析 1. hashset实现原理 hashset存储无序,不...

  • HashSet的用法

    java集合——HashSet的用法 一、HashSet的构造 二、HashSet添加元素 三、遍历HashSet...

  • HashSet, LinkedHashSet源码

    目录 HashSet LinkedHashSet HashSet 对于HashSet而言,它是基于HashMap实...

  • 深入理解-HashSet源码解读

    HashSet HashSet的源码很简单,继承自AbstractSet,实现了Set, Cloneable...

  • 深入剖析HashSet和HashMap实现

    HashSet是一个包含非重复元素的集合,如何实现的,要从底层实现代码看起。 背景 首先非重复元素如何定义,看Se...

网友评论

      本文标题:HashSet深入

      本文链接:https://www.haomeiwen.com/subject/fkhiattx.html