hashset为什么用hashmap实现_HashSet的原理

我们先看一下HashSet和TreeSet在整个集合框架中的位置。他们都实现了Set接口。他们之间的区别是HashSet不能保证元素的顺序,TreeSet中的元素可以按照某个顺序排列。他们的元素都不能重复。

3d77f5a09a820b7f69ef16a68c0fb8eb.png

先来看一下HashSet:

public static void main(String[] args) {
Set<String> set = new HashSet<String>();
set.add("张三");
set.add("李四");
set.add("王五");
System.out.println(set);

System.out.println(set.size());

System.out.println(set.contains("张三"));
}

打印输出的顺序是是: [李四, 张三, 王五]

可以看出和存进去的顺序不一致。

我们先看一下 Set<String> set = new HashSet<String>();

这行代码创建了一个HashSet,构造函数如下:

public HashSet() {map = new HashMap<>();
}

可以看到实际上是创建了一个HashMap的对象。没错,HashSet底层就是一个HashMap.

6026f6f883ad81a377277ff416b21b63.png

再来看一下这行代码:set.add("张三");

public boolean add(E e) {return map.put(e, PRESENT)==null;
}

非常的简单,就是调用了一下HashMap的put方法对元素进行插入。

这里的PERSENT是什么呢?继续顺藤摸瓜:

private static final Object PRESENT = new Object();
原来就是一个普通的Object对象前面用static final修饰说明是不可变的。

f8a3f791129799a42b9e275560ea9372.png

继续添加:set.add("李四");

450201037cf7880ded0acc73dee05670.png

可以看出来HashMap的key分别为”张三”,”李四”,“王五”, 因为HashSet用不到value,他们的value都是一样的指向同一个地方。继续往下看:System.out.println(set.size());

public int size() {return map.size();
}

也是调用的HashMap的size方法。

System.out.println(set.contains("张三"));

public boolean contains(Object o) {return map.containsKey(o);
}

同样调用的HashMap的contains方法。

如果该文章对你有帮助别忘了 点赞,收藏加关注,你的支持就是我持续更新的动力!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值