
1、*说一说集合类的体系结构说一下你经常用的集合类我们常见的集合主要有两大类分别是单列集合和双列集合2、*ArrayList和LinkedList的区别ArrayList和LinkedList都是Java中的单列结合都是有序的可重复的不同点有下面几个底层数据结构不同ArrayList 底层是动态数组查询快增删慢而LinkedList底层是双向链表LinkedList查询慢增删快占用内存空间不同LinkedList比ArrayList更占内存这是因为它的每个节点除了存储数据还存储了前后节点的引用两个引用3、*HashMap和HashTable区别HashMap和HashTable都是Map的子类都可以存储键值对的数据区别点在于HashTable是线程安全HashMap则不是HashTable的线程安全是通过底层在每个方法上添加synchronized 实现的因此它的效率要比HashMap低如果碰到需要线程安全的场景我们则会使用ConcurrentHashMap而不用HashTable所以我对它的了解也就这些ConcurrentHashMap相比较HashTable来说他用到了乐观锁结合悲观锁一起使用的4、HashMap的底层原理HashMap底层数据结构是在JDK1.8之前是数组链表实现在JDK1.8之后是数组链表红黑树下面我以map中存储对象的流程给您说一下它的实现原理把当我们创建一个HashMap的时候JDK就会在内存中创建一个长度为16的数组当我们调用put方法像HashMap中保存一个元素的时候它会先调用key的hashCode方法计算出key的hash值然后使用得到hash值对数组长度取余找出当前对象的元素在数组中的位置接下来它会判断算出的位置上是否有元素如果没有就会将此元素直接存储到当前位置上如果算出的位置上有元素或者是有链表它会再调用key的equals方法跟存在元素的key做比较如果有一个比较得到的结果为true则会进行值的覆盖如果都为false则会将元素追加在链表的末尾当然为了降低Hash冲突和链表长度HashMap还做了一些优化当元素的数量超过数组大小与加载因子的乘积的时候就会执行扩容扩容为原来的2倍并将原来数组中的键重新进行hash运算然后分配到新数组中当链表的长度8并且数组长度64的时候链表就会转换为红黑树当红黑树结点数小于6时将再次转回为链表。