集合

作者: Spring_java | 来源:发表于2018-04-07 21:38 被阅读0次

    1:collection 下面有list set

    线性表包含两者 顺序表和链表

    其中List属于线性表的一种。

    list 下面有arrayList  LinkedList  vector

    arrayList 下面是一个动态数组,元素在内存中是按照顺序排列的。  初始容量为10.当容量不足的时候,就会扩容为原来的0.5倍。

    LinkedList 是链表实现的数组。是一个双向链表。

    Vector 其实就是把arrayList里面的部分方法进行了synchronized加锁处理。但是在扩容上不是一样的,扩容是直接扩容1倍

    Set下面有TreeSet  HashSet

    TreeSet 底层是二叉树的实现,原理是因为在插入数据之前会先对其进行比较,有一个Compareable方法。

    HashSet 底层是Hash表的实现,保证完全有序,LinkedHashSet.HashSet底层声明了一个HashMap

    Hash表采用的是链地址法来解决冲突,是一个数组+++链表的形式

    需要重写equal++hashCode方法来保证数据唯一。

    Map

    map里面包含了hashMap TreeMap

    HashMap 底层其实还是一个数组,容量是16.有个加载因子是0.75;但是里面保存的数据有可能是null。

    当加入新元素的时候,就会创建一个Node对象,指针域就会指向下一个添加的对象,数据域就保存了新加入的data。

    也有可能是单向链表,还有可能是红黑树。

    1、计算key的hash值,算出元素在底层数组中的下标位置。

    2、通过下标位置定位到底层数组里的元素(也有可能是链表也有可能是树)。

    3、取到元素,判断放入元素的key是否==或equals当前位置的key,成立则替换value值,返回旧值。

    4、如果是树,循环树中的节点,判断放入元素的key是否==或equals节点的key,成立则替换树里的value,并返回旧值,不成立就添加到树里。

    5、否则就顺着元素的链表结构循环节点,判断放入元素的key是否==或equals节点的key,成立则替换链表里value,并返回旧值,找不到就添加到链表的最后。

    在1.7的时候,采用链地址法来解决Hash冲突。还是单向链表和数组

    在1.8的时候,为了提高效率,当链表长度超过8的时候,会开始转换为红黑树。

    相关文章

      网友评论

          本文标题:集合

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