zoukankan      html  css  js  c++  java
  • Hashset,Iterator

    HashSet类主要是设计用来做高性能集运算的,例如对两个集合求交集、并集、差集等。集合中包含一组不重复出现且无特性顺序的元素。

    (一)HashSet的一些特性如下:

    1、HashSet中的值不能重复没有顺序

    2、HashSet的容量会按需自动添加。

    (二)那么HshSet是如何做到集合中的值不重复呢?

    当使用HashSet时,hashcode()方法就会得到调用,它会先判断已经存储在集合中的对象的hash code值是否与新增加的对象的hash code的值一致,如果不一致,就直接加入到集合中;如果一致,那么再进行equals方法的比较,如果equals方法返回true,说明对象已经存在,所以不加进去了,否则加进去。

    (三)HashSet里面并没有get()方法,那么我们就要用迭代器Iterator

    迭代器(Iterator)模式,又叫做游标(Cursor)模式:

    提供一种方法访问一个容器(container)对象中各个元素,而又不需暴露该对象的内部细节。 从定义可见,迭代器模式是为容器而生。很明显,这里的容器对象是HashSet。

    主要用到的方法主要有两个:

    a)hasNext()方法:判断容器是否有下一个元素,是的话返回true,不存在的话返回false。

    b)next()方法:取出下一个元素。

    那么,如何用迭代器来输出HashSet的内容呢,看下面代码:

    上述代码生成了一个 Iterator 对象, while结构利用hasNext()方法遍历HashSet的元素,再利用next()方法访问。

    (五)HashSet底层是使用HashMap实现的,当使用add方法将对象添加到Set当中时,实际上是将该对象作为底层所维护的Map对象的key,而value则都是同一个Object对象,这个Object对象实际上我们是用不上的。而Map对象的底层是一个一个Entry对象组成。

     

    (六)当向HashMap中put一对键值时,它会根据key的hashCode值计算出一个位置,该位置即使此对象准备往数组中存放的位置。

    如果计算出的位置没有对象存在,就把此对象放在那个位置,如果该位置已经存在对象,则顺着该位置的对象的链开始寻找(Entry类有一个Entry类型的next成员变量,指向该对象的下一个对象),不断地调用equals方法跟链上的对象进行比较,如果链上的对象与这个要插入的对象的equals方法都返回false,则把这个对象插入到该位置的最前面,并且指向原来链上的第一个Entry对象。

    如图:

     

  • 相关阅读:
    39岁了,我依旧要谈梦想
    ASP原码加密工具介绍
    extjs_07_combobox&tree&chart
    JS0基础学习笔记(1)
    AndroidUI组件之ActionBar
    Sourcetree 更新git账号密码
    iOS人脸识别核心代码(备用)
    ios 中的tintColor
    appStore上传苹果应用程序软件发布
    iOS9适配 之 关于info.plist 第三方登录 添加URL Schemes白名单
  • 原文地址:https://www.cnblogs.com/vmax-tam/p/4074640.html
Copyright © 2011-2022 走看看