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),元素的寻找时间越短,内存浪费越多.

     

  • 相关阅读:
    C# Split() 去除 分组
    C#获取当前路径的7种方法
    给 C# 开发者的代码审查清单
    【知乎】一句话答案收录集,一句足矣
    C# string和byte[]的转换
    WCF 有零个操作;协定必须至少有一个操作
    WPF中动态改变控件显示位置
    转 将iPhone和Android手机屏幕投影仪投影显示
    转 MySQL数据库监控软件lepus使用问题以及解决办法
    转 Shell中的IFS解惑
  • 原文地址:https://www.cnblogs.com/plxx/p/4467057.html
Copyright © 2011-2022 走看看