码迷,mamicode.com
首页 > 其他好文 > 详细

HashSet的原理

时间:2019-12-30 10:01:40      阅读:84      评论:0      收藏:0      [点我收藏+]

标签:col   rgs   mamicode   set   ros   框架   方法   OLE   图片   

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

技术图片

  先来看一下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。

技术图片

  再来看一下这行代码:set.add("张三"),非常的简单,就是调用了一下HashMap的put方法对元素进行插入。

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

  这里的PERSENT是什么呢?继续顺藤摸瓜,原来就是一个普通的Object对象前面用static final修饰说明是不可变的。

private static final Object PRESENT = new Object();
技术图片

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

技术图片

  可以看出来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方法。

HashSet的原理

标签:col   rgs   mamicode   set   ros   框架   方法   OLE   图片   

原文地址:https://www.cnblogs.com/lbky/p/12117233.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!