zoukankan      html  css  js  c++  java
  • #java#集合#基本概念

    集合专题

    HashSet

    HashSet不是按照存储元素的顺序写入的,而是通过按照哈希值来存的,所有取数据也是按照哈希值取得,HashSet首先
    判断两个元素的哈希值,如果哈希值相同,会接着比较 equals方法。 hashset通过 hashCode的值来确定元素在内存中的位置,
    一个hashcode位置有多个元素。

    TreeSet

    自定义的对象必须要实现 Comparable的接口,重写 compareTo的函数 才能使用。也可以策略模式,自己定义一个比较器

    LinkedHashSet(HashSet + LinkedHashMap实现)

    底层使用的是 LinkedHashMap保存对象,但是又继承了 HashSet的方法,直接调用的 HashSet的方法。

    HashMap(数组,链表,红黑树)

    HashMap 根据键值的Hashcode存储数据,一般情况下可以直接定位它的值。 HasHMap里面是一个数组,数组的每个元素都是一条单向链表

    capacity: 数组的容量,始终保持为 2N, 扩容后数组大小是当前两倍
    loadFactor,负载因子,默认为 0.75
    threshold: 扩容的阈值,达到这个阈值了,就会扩容 ,等于 capacity*loadFactor
    java 8对 Hashmap做了改进,当 数组容量大于 64,且链表中的元素超过8个以后,这个链表会转为红黑树。
    选择8是因为符号泊松分布,超过8的时候,概率已经非常小了.所以选择8

    ConcurrentHashMap

    ConcurrentHashMap在8以前使用的是一个 Segment数组继承了 ReentrantLock加锁,每次加锁锁住一个 Segment,每个segment是线程安全的,因此也就整一个 HashMap都是线程安全的了。

    concurrentcyLevel: segment的数量,也就是并行级别,segment数量决定了一个 ConcurrentHashMap 的最大线程并发数量是多少。 ConcurrentHashMap 默认 16个segments,理论上只能同时支持最多16个线程的并发。

    java8则是 使用了 CAS的方法来优化。而且 ConcurrentHashMap也是使用了红黑树。

    TreeMap

    实现了 SortedMap接口,可以根据键值来排序,
    TreeMap

    LinkedHashMap

    遍历时候 会按照插入的顺序进行遍历

  • 相关阅读:
    ASP.NET MVC+EF在服务端分页使用jqGrid以及jquery Datatables的注意事项
    Oracle10g在Win2008R2下因版本无法安装问题的解决
    oracle 表被锁了解决方案
    用shell获得hadoop中mapreduce任务运行结果的状态
    发现一个c++ vector sort的bug
    跳青蛙问题与变态跳青蛙问题
    关于const *和 * const
    格雷码的计算(转)
    不安装oracle客户端,如何运行sqlplus
    Sqoop 将hdfs上的文件导入到oracle中,关于date类型的问题
  • 原文地址:https://www.cnblogs.com/lyr-2000/p/13298120.html
Copyright © 2011-2022 走看看