zoukankan      html  css  js  c++  java
  • 集合整理

    集合整理

    一、概述

    集合顶层分为 CollectionMap

    其中Collection分为listset

    list有Arraylist、vector、linkedlist

    ArrayList存取有序,可重复,底层是用数组,查询速度快,增删速度慢,线程不安全,扩容倍数是1.5倍+1

    vector存取有序,可重复,底层是数组,查询速度快,增删慢,线程安全效率低,默认扩展一倍容量

    linkedlist存取有序,可重复,底层使用双向循环列表数据结构,查询速度慢,增删快,线程不安全,有专门用于操作表头和表尾的方法,可以当做堆、栈、队列和双向队列使用

    总结:所有的list集合都是存取有序,可重复的,区别是底层是数组的查询快,增删慢,底层是链表的查询慢,增删快。

    set集合分为hashset、TreeSet、linkedHashSet

    HashSet:存取无序,不可重复,底层使用Hash表实现,存取速度快,内部是HashMap

    TreeSet:存取无序,不可重复,但是是排序存储,或者升序,或者降序,存储自定义对象的时候,要实现comparable接口,重写compareTo函数,规定排序规则,底层使用二叉树。

    LinkedHashSet:存取有序,因为使用Hash表存储,使用双向链表记录插入顺序,内部是LinkedHashMap

    总结:HashSet存取无序,不可重复,TreeSet,存取无序,但是排序存储。LinkedHashSet存取有序,不可重复。

    Map集合有:HashMap、HashTable、TreeMap

    HashMap:键不可重复,值可重复,底层是数组+链表+红黑树、线程不安全、允许key值为null只允许一条,value也可以为null可以多条。

    capacity:扩容为2倍,loadFactor:负载因子为0.75.

    每个存储单位包括:key、value、hash、单向链表的next。

    扩容的阈值是capacity*loadFactor

    链表数据超过八个,链表会进化成红黑树,减少到6个会退回链表

    ConcurrentHashMap

    ConcurrentHashMap是hashMap的线程安全版本。它由一个个的Segment组成,可以理解成部分、一段、分段锁或者槽来理解。

    Segment通过集成Reentrantlock来进行加锁,所以每次并发操作,锁住的是segment,以此来实现并发安全。

    concurrenthashmap的并行度默认是16,也就是理论上最多可以同时支持十六个线程并发写。这个值初始化的时候可以改变,一旦初始化后不可以扩容。

    其实可以看成concurrentHashMap是HashMap的集合,每个segment都是一个HashMap。

    HashTable:键不可重复,值可重复,底层哈希表,线程安全,key、value不允许为null。

    TreeMap:键不可重复,值可重复,底层二叉树。有自然排序,按照倒叙(按着插入顺序的倒叙)的方法取出,有定制排序,自己定制排序规则

    总结:Map的键都不可重复,值可重复,其中HashMap的key允许一次空值,value可以多条都是空值。map线程不安全,hashtable和concurrenthashmap线程安全,concurrenthashmap并发更高。treemap排序存储。

  • 相关阅读:
    C++ 实现简单快速排序
    LEETCODE 198. House Robber
    leetcode 174
    GIT 版本的回退
    unorderd_map 自定义键值及哈希函数的重载
    互斥锁 形成死锁实例
    leetcode 300
    LeetCode 62
    LeetCode 122
    SVN提交,强制注释
  • 原文地址:https://www.cnblogs.com/gushiye/p/13961080.html
Copyright © 2011-2022 走看看