ArrayList及HashMap

695 阅读2分钟

面试题:blog.csdn.net/ThinkWon/ar…

ArrayList

底层数组,但是会动态增长、只存数据,不存地址,逻辑顺序和物理顺序一致。

优点:按照索引查询效率高

缺点:删除效率低

底层

  • jdk1.7初始化容量为10,1.8初始化为0,在第一次添加元素的时候进行扩容
  • 当容量满时会进行扩容,默认每次扩容为1.5倍

LinkedList

双向链表,不连续的空间,不仅存数据,还存地址,逻辑顺序和物理顺序不一致。

优缺点与ArrayList相反

ArrayList与LinkedList谁更浪费空间?

都浪费,ArrayList创建固定空间,但不一定使用到那么多空间;LinkedList虽然使用多少创建多少,但是既要数据又要地址。

HashMap

哈希表,key-value结构

www.jianshu.com/p/939b8a672…

底层

  • 1.7 是数组加链表,1.8是链表大于8之后链表为红黑树,目的是减少比较次数,提高效率

  • 链表上的每个节点就是一个Entry

    • hash哈希码
    • key键
    • value值
    • next指向下一个Entry节点
  • 默认长度16

  • 默认装填因子0.75(元素个数达到主数组长度的75%时扩容)

  • 扩容为原来的2倍,new一个新的数组,将老的数组中的数据一个个的转移,不是复制

    • jdk1.7扩容后链表中的数据顺序相反
    • 1.8扩容不会发生改变
  • 发生hash冲突,经过比较不存在相同的key元素,要添加一个新的节点。1.7不是添加在链表最后,而且最前;1.8是插在链表的尾部

  • HashSet底层就是HashMap,HashSet为HashMap的key,value为new Object()

ConcurrentHashMap

1.7
  • Segment数组

  • Segment:是一个对象,类似于一个小的HashMap

  • 并发级别:代表着一个Segment管理着几个HashMap数组

1.8
  • 对每个数组的头节点进行锁
  • 扩容中的转移数据时,会有一个标记,当另一线程进入时发现标记后则会帮助扩容线程进行扩容