zoukankan      html  css  js  c++  java
  • Java 集合小记

    结论:

    1.  数组查询快, 链表增删快

    2. hash(散列)算法使得数据成散列分布, 插入和取出两次计算确定位置, 可能发生碰撞

    3. 集合长度是可变的

    根据结论可以得到如下推论:

    1. 哈希(散列)表是数组和链表的组合,  不仅查询快, 而且增删快

    2. 确保元素唯一的时, 先比较 hashCode(), 再比较 equals()

    3. 解释了 ArrayList 和 HashMap 有自动扩容机制

    集合

     |--Collection

        |--List

          |--ArrayList: 底层数组, 线程不同步, 查询快

          |--LinkedList: 底层链表, 线程不同步, 增删快

          |--Vector: 底层数组, 线程同步, 查询增删都慢

        |--Set(底层使用的 Map 集合)

          |--HashSet: 底层 hash 表, 线程不同步, 无序

            |--LinkedHashSet: 有序

          |--TreeSet: 底层红黑树,  线程不同步, 元素排序

     |--Map

       |--HashMap: 底层 hash 表, 线程不同步, K-V 可为null

       |--Hashtable: 底层哈希表, 线程同步, K-V 不可为null

       |--TreeMap: 底层红黑树, 指定的 K 顺序排序

    ArrayList

      |--源码 add() 没有 synchronized 关键字, 因而线程不同步

      |--初始大小为10, 容量不够则扩容为原来的1.5倍(>>1相当于 /2)

    HashSet

      |--源码 add() 没有 synchronized 关键字, 因而线程不同步

      |--底层调用的 Map 集合的 put()

      |--K 已存在, 新 V 替旧 V, 元素不重复

    HashMap

      |--源码 put() 没有 synchronized 关键字, 因而线程不同步

      |--先比较 hash 值, 再用 equals() 比较

      |--K 已存在, 新 V 替旧 V

      |--初始大小为16, 负载因子0.75, 最大容量即12, 容量不够扩容为原来的 2倍 

     

     TreeMap

      |--源码 put() 没有 synchronized 关键字, 因而线程不同步

      |--红黑树需要每次调用平衡算法

  • 相关阅读:
    HDU 1847 Good Luck in CET-4 Everybody! (博弈)
    HDU 1242 Rescue (BFS+优先队列)
    POJ 1061 青蛙的约会(扩展欧几里德算法)
    UVa 1610 Party Games(思维)
    hdu 1025LIS思路同1257 二分求LIS
    hdu 1257 LIS (略坑5
    什么是可串行化MVCC
    老板又出难题,气得我写了个自动化软件
    opencv学习一:概述与环境搭建(python3.7+pycharm)
    人工智能能力提升指导总结
  • 原文地址:https://www.cnblogs.com/sunjunxi/p/8526979.html
Copyright © 2011-2022 走看看