Java基础-容器

一、整体架构

几个基础问题:

1.List如何排序?

2.List删除某个元素

3.对比问题(关键是掌握每个的特性):

  List和Set的区别

  ArrayList和HashSet的区别

  HashMap和Hashtable区别

二、ArrayList

1.概述

2.源码

3.扩容机制

4.快速失败机制

5.CopyOnWrite原理及缺点

三、HashSet

四、HashMap

1.hashmap的数据结构 

  - 数组+链表+红黑树(jdk8)

//数组
Node[] table

//数组元素的结构
static class Node<K,V> implements Map.Entry<K,V> {
        final int hash;    //用来定位数组索引位置
        final K key;
        V value;
        Node<K,V> next;   //链表的下一个node
}

  - 数组table长度length大小强制是2的n次方(“强制”的意思是不管你传入的是否是2的n次方,都会处理成2的n次方),那为什么是2的n次方呢?

      原因是:定位元素在table位置,当length为2的n次方时,有一个规律 “h& (length-1)=h%length”,然而运算效率上&比%元素高,所以底层强制2的n次方。

      简单一句话就是:HashMap中的hash算法,当length为2的n次方时,&比%效率更高

2.hash冲突解决

  - HashMap解决冲突用的是链地址法,也就是用数组+链表这种结构来解决hash冲突的

3.机制扩容

  - 扩容的时机(可以参考这篇文章 https://blog.csdn.net/u014532901/article/details/78936283)

     当map中包含的Node的数量大于等于threshold = loadFactor * capacity的时候,且新建的Node刚好落在一个非空的桶上,此刻触发扩容机制,将其容量扩大为2倍

  - 扩容的rehash造成并发死锁问题

    

3.红黑树

4.最小树化容量

5.hash冲突解决

五、Hashtable

六、ConcurrentHashMap

1.jdk7

2.jdk8

七、其他面试题

原文地址:https://www.cnblogs.com/yejiang/p/13507548.html