面试总结
Arraylist和LinkedList异同
-
线程安全:ArrayList和LinkedList都是不同步的,也就是不保证线程安全。
-
底层数据接口:ArrayList是Object数组;Linked List底层使用的是双向链表数据结构。(JDK1.6之前使用的是循环链表。1.7取消了循环。循环链表与双向链表的区别)
-
插入和删除元素的效率:
ArrayList采用数组存储,所以插入和删除元素的时间复杂度受元素位置影响
Linkedlist采用链表存储,所以插入,删除元素的时间复杂度不受元素位置影响。
-
是否支持随机访问:LinkedList不支持高效的随机元素访问,而ArrayList支持。通过下标访问。对应get(int indext)方法
-
内存空间占用:ArrayList 的空间浪费主要体现在在list 列表的结尾会预留一定的容量空间,而LinkedList 的空
间花费则体现在它的每一个元素都需要消耗比ArrayList 更多的空间(因为要存放直接后继和直接前驱以及数
据)
补充内容:翻看API时发现ArrayList实现了RandomAccess和cloneable这两个接口
对于Cloneable接口:一个类实现Cloneable接口,以指示Object.clone()方法,该方法对于该类的实例进行现场复制是合法的。 在不实现Cloneable接口的实例上调用对象的克隆方法导致抛出异常CloneNotSupportedException
对于RandomAccess与Cloneable接口一样,什么都没有定义用于标识实现这个接口的类具有随机访问功能并且实现该接口的类for循环要比Iterator迭代的快
拓展:实现了RandomAccess接口的List,优先使用for循环遍历,其次foreach(foreach通过iterator遍历)
未实现该接口的List,邮箱使用iterator遍历,
Arraylist和Vector异同
Vector线程安全。所有的方法都是同步的。效率低。同步操作耗费大量时间
ArrayList不同步。不需要保证线程安全的情况下建议使用ArrayList
HashMap的底层实现
JDK1.8之前
底层是 数组加链表 实现的,也就是链表散列。HashMap通过哈希值来判断当前元素的存放位置.如果当前位置有元素的话。判断是否相同、相同就覆盖不相同使用拉链法解决冲突
JDK1.8之后
对于解决哈希冲突有了较大的变化、当链表长度大于8时,会将链表转换为红黑树。减少搜索时间
TreeMap、TreeSet 以及JDK1.8 之后的HashMap 底层都用到了红黑树
HashMap 和Hashtable 的区别
- 是否同步 :HashMap 是非线程安全的,HashTable 是线程安全的;HashTable 内部的方法基本都经过
synchronized 修饰。(如果你要保证线程安全使用ConcurrentHashMap- 效率 :因为线程安全的问题,HashMap 要比HashTable 效率高一点。另外,HashTable 基本被淘汰,不要在代码中使用它
- 是否支持Null值 :HashMap中null可以作为key但只能有一个,但是可以有多个null作为Value
HashTable只要put进的key有null就会抛出NullPointerException- 初始化大小和扩容 :HashMap默认初始化大小为16每次扩容变为原来的2倍、HashTable默认大小11扩容2n+1
HashMap多线程操作导致死循环的问题
线程一读取当前HashMap,在准备扩容时,线程二介入
线程二读取Map扩容
线程一继续执行可能会出现A->next B ->next A的情况
HashMap与hashSet的区别
HashSet底层是基于HashMap来实现的
Concurrent’Hash’Map与HashTable的区别
二者都是线程安全的,主要区别在于实现线程安全的方式上的不同
- 底层数据结构 :JDK1.7的ConcurrentHshMap底层采用分段数组+链表来实现。1.8与HashMap的数据结构一样 采用数组加链表和红黑树
HashTable数组加链表实现- 线程安全的实现:
在JDK1.7的时候ConcurrentHashMap使用分段锁机制,对整个数组进行了分割、每一把锁只锁容器中的一部分数据。多线程访问就不会出现锁竞争问题,提高了并发效率
到了JDK1.8时底层采用Node数组链表红黑树、,并发控制使用synchronized锁对应的时链表节点或者红黑树首节点
HashTable :会锁住整个Table
集合框架数据结构总结
Collection
List
ArrayList:Object数组
LinkedList:双向链表
Vectory:Object数组 线程安全
Set
HashSet:无序、唯一、基于HshMap实现,底层采用HashMap保存数据
LinkedHashSet:继承于HashSet,内部通过LinkedHashMap实现
TreeSet:有序、唯一:红黑树、自平衡排序二叉树
Map
HashMap:1.8之前数组加链表、拉链法解决哈希冲突;1.8之后使用数组链表/红黑树
LinkedHashMap:
HashTable:数组加链表
HashMap:1.8之前数组加链表、拉链法解决哈希冲突;1.8之后使用数组链表/红黑树
LinkedHashMap:
HashTable:数组加链表
TreeMap:红黑树