zoukankan      html  css  js  c++  java
  • set如何理解无序,不可重复性

    set如何理解无序,不可重复性

    以hashset为例

    1. 无序性:无序性不等于随机性,存储的数据在底层数组中并非按照数组索引的顺序添加,而是数据的hashcode值来决定的

    2. 不可重复:保证添加的元素,按照equals()判断时,不能返回true,即相同的元素只能添加一个

      先hashset中添加元素a,首先会元素a所在类的hashcode,计算元素a的hash值,此时哈希值通过某种算法,计算出在hashset底层数组中存放的位置(即为索引位置),

      判断数组此位置上是否有元素,如果没有元素,,则元素a添加成功

      如果此位置上有其他元素B(或者以链表形式存在的多个元素),则比较a与存在元素的hash值

      如果hash值不同,则元素a添加成功-------------->情况1

      如果hash值相同,进而需要调用元素a所在类的equals方法,如果返回true,则a添加失败

      ​ 如果返回false,则添加成功------------>情况2

    对于情况一,情况二,添加成功的元素则以链表的方式存储

    jdk7:元素a放到数组中,指向原来的元素

    Jdk8:原来的元素指向元素a;

    总结:七上八下

    (set接口中没有定义新的方法,使用的都是collection接口中的方法

    ​ 要求:向set中添加数据,其所在的类一定要重写hashcode方法和equals方法

    ​ 要求:重写的hashCode和equals方法尽可能保证一致性,即相等的对象必须具有相同的散列码

    补充

    LinkedHashSet作为hashset的子类,在添加数据的同时,每个数据还维护了两个引用,记录次数据前一个数据和后一个数据。(这样使得使用linkedhashset时,造成添加的先后顺序,和打印的先后顺序一致,但其实存放的数据还是无序的,只是通过链表维护起来了,方便遍历)

    优点,对于频繁的遍历,使用linkedhashset,效率要比hashset高

  • 相关阅读:
    Xcode 6 下添加pch头文件
    兵器簿之github的配置和使用
    sql 2005性能调优
    C#遍历枚举(Enum)值
    使用 jQuery 调用 ASP.NET AJAX Page Method
    强制不使用“兼容性视图”的HTML代码
    HR在ERP实施过程中的作用
    WdatePicker日历添加事件,在任意月改变时处理日期事件
    JQuery实现表格自动增加行,对新行添加事件
    获取元素离文档各边的距离
  • 原文地址:https://www.cnblogs.com/qingfeng5438/p/13670401.html
Copyright © 2011-2022 走看看