1.List,Set,Map三者的区别
List:List接口存储一组不唯一(可以有多个元素引用相同的对象),有序的对象
Set:不允许重复的集合。不会有多个元素引用相同的对象
Map:使用键值对存储。Map会维护与Key有关联的值。俩个Key可以引用相同的对象,但Key不能重复
2.Arraylist与Linkelist区别
1.Arraylist和Linklist都是不同步的,也就是不保证线程安全
2.Arraylist底层使用的是Object数组。Linkleist底层是使用双向链表数据结构
3.Arraylist采用数组存e储,所有插入删除元素的时间复杂程度受元素位置的影响
Linkelist采用列表存储,所有对于add(E e)方式插入,删除元素时间复杂度不受元素位置的影响
4.Arraylist支持快速随机访问,Linkelist不支持快速随机访问
5.Arraylist的空间浪费主要体现在list链表的结尾会预留一定的容量空间
Linkelist的空间花费则体现在它的每一个元素都需要消耗比Arraylist更多的空间
3.双向链表和双向循环链表
双向链表:包含俩个指针,一个prev指向前一个节点,一个next指向后一个节点
双向循环链表:最后一个节点的next指向head,而head的prev指向最后一个节点构成一个环。
4.HashMap和Hashtable的区别
1.HashMap是非线程安全的。Hashtable是线程安全的
2.因为线程安全的问题HashMap要比Hashtable效率高,Hashtable现在基本被淘汰
3.HashMap中null可以作为键,这样键只有一个,可以有一个或多个键所对应的值为null。但是在HashTable中put的键值只要有一个null,直接抛出空指针异常
4.在JDK1.8以后 的HashMap在解决哈希冲突时有了较大的变化,当链表长度大于域值(mor为8),将链表转化为红黑树,可以减少搜索时间。Hashtable没有这样的机制
5.HashMap和HashSet区别
HashMap | HashSet |
---|---|
实现了Map接口 | 实现了Set接口 |
存储键值对 | 仅存储对象 |
调用put()向map添加元素 | 调用add()方法向Set中添加元素 |