MS系列:Java集合框架

集合框架继承关系
Collection 所有子类集合都用于存储Value
    List
        ArrayList 线程不安全,底层是数组结构Object[],每次扩容50%
        LinkedList 线程不安全,底层是链表结构,每次扩容翻倍
        Vector 线程安全,底层是数组结构Object[],每次扩容翻倍
            Stack 在Vector的基础上实现了后进先出的方法:推送、弹出、查看堆栈中的顶层元素、测试堆栈是否为空、搜索堆栈中的元素并返回还有多远到达顶部
    Set 存储无序的不可重复元素,允许一个null元素
        SortedSet(interface)
            TreeSet 底层使用TreeMap, 保存的对象必须实现Comparable接口
        HashSet 底层使用HashMap
            LinkedHashSet 使用链表维护元素的顺序,底层使用HashMap或LinkedHashMap
    Queue FIFO (first-in-first-out), PriorityQueue除外 
        PriorityQueue 根据提供的比较器对元素进行排序,或者元素的自然顺序
        Deque(interface)
            LinkedList
Map 所有子类集合都用于存储Key-Value
    HashMap 线程不安全,key/value允许为null,初始容量16,每次扩容增加一倍,当元素数量大于最大容量*0.75时进行扩容。 遍历HashMap的结果是无序的。
        LinkedHashMap 在HashMap的基础上增加了双向链表的功能,可以按插入顺序或访问顺序遍历元素。
    HashTable 跟HashMap一样,只是线程安全,key/value不允许为null
        Propertie
    SortedMap
        TreeMap 用红黑二叉树实现http://cmsblogs.com/?p=1013
数组结构和链表结构的区别:

http://www.trinea.cn/android/arraylist-linkedlist-loop-performance/
1. 第i个元素插入或删除元素时:数组结构索引i后面的元素必须后移或前移,此时数组结构比链表结构效率很低很多。
2. 在最后一个元素插入或删除元素时,数组结构比链表结构效率高一些。
3. 查询元素时:链表结构list.iterator().next()比list.get(i)效率高很多,数组结构list.iterator().next()比list.get(i)效率略低。

LinkedList 的内部结构:
    LinkedList
        int count;
        Node<E> first;
        Node<E> last;
    Node<E>
        E e;
        Node<E> prev;
        Node<E> next;
HashMap存储数据的步骤:

(Java8中HashMap实现较复杂,参考Java8中HashTable代码。)http://blog.csdn.net/jeffleo/article/details/54946424
1. 传入key和value,判断key是否为null,如果为null,则调用putForNullKey,以null作为key存储到哈希表中;
2. 然后计算key的hash值,根据hash值搜索在哈希表table中的索引位置,若当前索引位置不为null,则对该位置的Entry链表进行遍历,如果链中存在该key,则用传入的value覆盖掉旧的value,同时把旧的value返回,结束;
3. 否则调用addEntry,用key-value创建一个新的节点,并把该节点插入到该索引对应的链表的头部。

HashMap读取的步骤
    1. 如果key=null,直接调用getForNullKey()获取value值,返回。否则:
    2. 调用hash(key)求得key的hash值,然后调用indexFor(hash)求得hash值对应的table的索引位置,然后遍历索引位置的链表,如果存在key,则把key对应的Entry返回,否则返回null。
    注:判断Key是否存在的办法(e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k))))
HashMap的内部结构:
    HashMap
        int DEFAULT_INITIAL_CAPACITY = 16; //默认的初始容量为16 
        int MAXIMUM_CAPACITY = 1 << 30; //最大的容量为 2 ^ 30 
        float loadFactor = 0.75f; //默认的加载因子为 0.75f 
        Node<K,V>[] table; //Entry类型的数组,HashMap用这个来维护内部的数据结构,它的长度由容量决定 
        int size; //HashMap的大小 
        int modCount; //修改的元素数量
        int threshold;  //HashMap的极限容量,扩容临界点(容量和加载因子的乘积)
    Node<K,V>
        int hash //key的hash值
        K key
        V value
        Node<K,V> next //指向下一个元素
JDK8中HashMap做了哪些改进

https://my.oschina.net/hosee/blog/618953
JDK7中HashMap采用的是位桶+链表的方式,即我们常说的散列链表的方式。
而JDK8中采用的是位桶+链表/红黑树(有关红黑树请查看红黑树)的方式,也是非线程安全的。当某个位桶的链表的长度达到某个阀值(8)的时候,这个链表就将转换成红黑树。
https://my.oschina.net/hosee/blog/618828 红黑树

JDK8中ConCurrentHashMap做了哪些改进

http://www.importnew.com/22007.html
不采用segment而采用node,锁住node来实现减小锁粒度。
设计了MOVED状态 当resize的中过程中 线程2还在put数据,线程2会帮助resize。
使用3个CAS操作来确保node的一些操作的原子性,这种方式代替了锁。
sizeCtl的不同值来代表不同含义,起到了控制的作用。

LinkedHashMap的内部结构,在HashMap的基础上增加了以下属性:

http://blog.csdn.net/justloveyou_/article/details/71713781
LinkedHashMap
Node

红黑树规范:
    每个结点要么是红的要么是黑的。  
    根结点是黑的。  
    每个叶结点(叶结点即指树尾端NIL指针或NULL结点)都是黑的。  
    如果一个结点是红的,那么它的两个儿子都是黑的。  
    对于任意结点而言,其到叶结点树尾端NIL指针的每条路径都包含相同数目的黑结点。
时间复杂度、排序算法
http://blog.csdn.net/itachi85/article/details/54882603  算法(一)时间复杂度
https://www.cnblogs.com/onepixel/articles/7674659.html  十大经典排序算法
https://www.cnblogs.com/chengxiao/p/6104371.html        图解排序算法(二)之希尔排序
http://blog.csdn.net/lingzhm/article/details/45022385   Jdk1.7中提供的默认的排序算法
http://www.cnblogs.com/ahalei/p/                        【坐在马桶上看算法】系列
插入排序
    对于大规模的乱序数组,插入排序会很慢,因为它只会交换相邻的元素,元素只能一点一点的从数组的一端移动到另一端。如果最小的元素在数组的末尾,则要将它移动到数组的开头则需要进行n-1次移动。
希尔排序
    希尔排序改进了插入排序这一问题,它交换不相邻的元素对数组进行局部排序,并最终用插入排序将局部有序的数组进行排序。 希尔排序是第一个将负责度从O(n2)降到O(nlogn)的算法。
选择排序
    每次选取最小的数字排在前面,比较运算的次数比较多,移位运算很少,因此某些情况下效率比较高。
冒泡排序
    移位运算比较多


问题: 将一万个随机数排序,取最大的1000个
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_26182553

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值