Java集合
- List,Set,Map区别?
List:列表,有序.
Set:不允许重复的集合.
Map:key,value键值对,key不能重复
-
Arraylist 与 LinkedList 区别?
- 都是线程不安全的.
- 底层结构:
Arraylist -> private static final Object[] EMPTY_ELEMENTDATA = {}即Object数组;
LinkedList -> 双向链表
- 插入删除效率:
Arraylist -> 默认add()直接再list尾部添加,时间复杂度O(1),但是在指定位置i添加,时间复杂度为O(n-i),因为添加后n-i的元素都要向前或向后移动一位.
LinkedList -> 默认add()插入删除的时间复杂度近似O(1),在指定i位置添加删除的时间复杂度为O(n),因为要先移动到i位置处.
- 随机访问:
Arraylist -> 支持随机访问 get(index)
LinkedList 不支持
- 空间占用:
Arraylist -> 主要浪费体现在list末尾会预留空间.
LinkedList -> 主要浪费在他的每一个元素都比Arraylist的元素大,因为他的元素还要存储前驱后继以及数据.
- RandomAccess接⼝
Arraylist实现了此接口,所以它支持随机访问
-
List遍历:
1. 实现了 RandomAccess 接口,优先for循环,其次foreach. 2. 未实现 RandomAccess 接口,优先iterator,其次foreach.
-
Arraylist扩容机制?
1. 初始大小为10 private static final int DEFAULT_CAPACITY = 10; 2. 默认1.5倍扩容 int newCapacity = oldCapacity + (oldCapacity >> 1);
-
HashMap 和 Hashtable 的区别?
- 线程安全:HashMap非线程安全,Hashtable 线程安全,方法基本使用synchronized修饰.
- 效率:Hashtable 要频繁使用synchronized,所以效率不如HashMap,而且它基本被淘汰了,不建议在代码中使用.
- key或value可否为null: HashMap的key只有一个可以为null,但是值可以有多个null, Hashtable只要key为null就会报NullPointerException.
- 初始容量与扩容:
Hashtable 初始容量为11,每次扩容变为2n+1.
HashMap 初始容量为16,每次扩容变为2n.
- 底层结构:
Hashtable -> 数组+链表;
HashMap -> 数组+链表(1.8以前),数组+链表+红黑树(1.8),当链表长度大于8时变为红黑树,小于6时变成链表.
-
HashMap 和 HashSet区别?
HashSet底层基于HashMap 实现,只有少量方法是自己实现的.
- HashSet如何检查重复?
一个对象加入HashSet时,先计算 hashcode 得到对象加入的位置,同时和其他元素的 hashcode 比较,若没有相同那么这个对象不重复,否则调用 equals() 比较两个对象的值是否相同.