zoukankan      html  css  js  c++  java
  • 一天一个类,一点也不累之HashSet

    最近忙着一个小项目结题,故没能按时完成【一天一个类,一点也不累】,还好项目优秀,算是对自己一点点的安慰和鼓励。~~~

    今天要说的是HashSet

    既然是继承自Set,那么就必须有Set的一些属性,比如不能容许有相同(equals)元素的存在.阿门~~ 他也容许有null元素的存在。at most one null element。

    【需要注意】 Note that this implementation is not synchronized.  这个也不是线程安全的。

    同样感谢,官方给我们提供了线程安全的实现方法。

     Set s = Collections.synchronizedSet(new HashSet(...));

    【查看源码才知道--》】原来HashSet内部的实现是使用HashMap。  HashMap还没讲到,敬请期待。。。。

    还是看看他的一些方法:

    1、构造方法

      HashSet()

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

      HashSet(int initialCapacity) //提供指定初始大小的Set集合

    1     public HashSet(Collection<? extends E> c) {
    2         map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
    3         addAll(c);
    4     }

      发现如果使用其他容器来实现HashSet,实现之后的大小是原来的3/4+1 ,16二者的最大值

      HashSet(Collection<? extends E> c) 

      HashSet(int initialCapacity, float loadFactor)//指定初始大小,和负载因子(大于0)

    2、迭代器

      因为HashSet使用HashMap来实现的,在返回迭代器的时候,是返回keySet.iterator().

      既然这样,问题来了,HashSet只是使用了HashMap中的Key,那他的Value呢???

      请看下面的add方法

    3、add

       1 public boolean add(E e) {

      2 return map.put(e, PRESENT)==null;

      3 } 

      添加一个元素,只是在将该元素放入Map的key,value部分使用了一个叫做PRESENT的礼物,who is  PRESENT??

      private static final Object PRESENT = new Object();  定义了一个简单的Object.

    4、remove如何实现??

      既然在add中的value== PRESENT

      那就好办了!~~~~

      public boolean remove(Object o) {

        return map.remove(o)==PRESENT;
      }

      so smart~~~

    【注】

    在java语言中,通过负载因子(load factor)来决定何时对散列表进行再
    散列.例如:如果负载因子是0.75,当散列表中已经有75%的位置已经放满,
    那么将进行散列.
    负载因子越高(越接近1.0),内存的使用率越高,元素的寻找时间越长.
    负载因子越低(越接近0.0),元素的寻找时间越短,内存浪费越多.

     

  • 相关阅读:
    [Swift]LeetCode1249. 移除无效的括号 | Minimum Remove to Make Valid Parentheses
    [Swift]LeetCode1240. 铺瓷砖 | Tiling a Rectangle with the Fewest Squares
    一位资深程序员大牛给予Java初学者的学习路线建议
    Java基础——集合源码解析 List List 接口
    Java定时任务调度详解
    Java实现CORS跨域请求
    假如时光倒流,我会这么学习Java
    Java后端程序员1年工作经验总结
    20个高级Java面试题汇总
    JVM内幕:Java虚拟机详解
  • 原文地址:https://www.cnblogs.com/plxx/p/4467057.html
Copyright © 2011-2022 走看看