美文网首页
集合(容器)

集合(容器)

作者: 小偏离 | 来源:发表于2020-05-21 17:20 被阅读0次

    集合有两个分支,一是Collection   另一个是Map

    Collection的子类有Set ,  List  

    List:
     ----arrayList  底层通过数组实现, 带索引,但是一旦改动数据就会使数据重新排序,所以优点是查询快,缺点是增删慢
    -----linkedLIst 底层通过链表实现,通过下标实现排序,优缺点正好与arraylist相反
    -----vector 线程安全的集合

    (ArrayList 补充) : arraylist 初始长度默认是10 , 每次扩容默认扩原来的1.5倍
    (linkedLIst  补充):     

            linkedList底层是双向链表,每一个元素都有三部分,头,中,尾  .   头指向上一个元素,尾部指向下一个元素,头指向为空的元素,就是第一个元素,尾部指向元素为空的,就是最后一个元素,

            增删快的原因: 删除元素后,只需要改变上一个元素的尾部指向,跟下一个元素的头部指向,不需要移动链表

            查询慢的原因: 链表要查询某个位置上的元素,需要通过下标一个个找,效率低下.

    Set: hashSet底层实际就是一个HashMap,通过hashmap的key值不能重复的特点实现set的元素唯一性,map的value值存的都是new Object();

            treeSet: treeSet底层就是一个treeMap;

    Map

    HashMap HashMap 的优点是 :结合了arraylist跟linkedList的优点,既查询快,增删也快

    实现原理 : hashmap是基于哈希表实现的。如上图, map在调用put的时候,会将key的哈希码取出,将key进行算法运算后分配到entry[] 数组中相应的位置, 如:HashMap默认长度为16(当使用量达到75%时,会进行扩容到原来的两倍),索引值为hashCode%16的方式(效率最低的算法是hashCode/hashCode, 即退化成一个单向链表),当确定索引后,会将数据以链表形式存入数组,(   hash|key |  value |  next     ) , jdk8以后,当链表长度大于8,会转换为红黑树,进而增加查询效率

    取数据的实现如下图

    HashTable: hashTable 基本与hashMap相似,但是hashTable是线程安全的,效率较低,并且hashTable是不允许key跟value为null的

    TreeMap: treeMap是基于红黑二叉树实现的,是可排序的map集合,如果是对象需要排序,对象需要实现Comparable接口,并重写 CompartTo方法实现排序

    相关文章

      网友评论

          本文标题:集合(容器)

          本文链接:https://www.haomeiwen.com/subject/bjyrmhtx.html