1、List,Set,Map三者的区别
- List 储存一组不唯一的,有序的对象
- Set 不允许重复
- Map 使用键值对存储 key不能重复
2、ArrayList和LinkedList的区别
- 相同之处:二者都不同步,线程不安全
- 底层数据结构:ArrayList使用Object数组存储,插入和删除元素复杂度受到元素位置的影响;LinkedList使用链表存储,add(E element)删除时时间复杂度不受位置影响,指定位置受影响add(int index, E element)
- 快速随机访问get(int index):ArrayList支持 LinkedList不支持
- 内存空间:ArrayList在结尾预留空间,LinkedList要存放后继、前驱和数据
- ArrayList 实现了RandomAccess 接口, LinkedList没有实现。因为ArrayList 底层是数组,支持随机访问O(1);LinkedList需要遍历到位置才能访问指定元素O(n)
遍历List
3、ArrayList和Vector的区别?为什么用前者取代Vector?
- ArrayList出现于jdk1.2,vector出现于1.0.两者底层的数据存储都使用的Object数组实现,因为是数组实现,所以具有查找快、增删慢(因为往数组中间增删元素时,会导致后面所有元素地址的改变)的特点
- 都实现了RandomAccess接口
-
Vector类的方法都是同步的,可以由两个线程安全访问一个Vector对象,但是一个线程访问的放会在同步问题上耗费大量的时间
-
ArrayList不是同步的,不需要耗费精力保证线程安全
ArrayList扩容机制
- 第一步:把原来的数组复制到另外一个内存空间更大的数组中
- 第二步:把新元素添加到扩容后的数组中
不带参数和带参数的两种构造函数
- 在无参构造中,我们看到了在用无参构造来创建对象的时候其实就是创建了一个空数组,长度为0
- 在有参构造中,传入的参数是正整数就按照传入的参数来确定创建数组的大小,否则异常
无参构造:
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
带参构造:
public ArrayList(int initialCapacity) {
if (initialCapacity >0) {
this.elementData =new Object[initialCapacity];
}else if (initialCapacity ==0) {
this.elementData = EMPTY_ELEMENTDATA;
}else {
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
}
}
4、扩容 add(E e) 源码如下
public boolean add(E e){
ensureCapacityInternal(size+1);
elementData[size++] = e;
return true;
}
ArrayList每次扩容是原来的1.5倍
5、HashMap和HashTable的区别
- HashMap非线程安全;HashTable是线程安全的,内部的方法基本经过synchronized修饰。
- HashMap效率更高(和非线程安全有关系)
- HashTable 基本要被淘汰
- HashMap可以使用一个null作为健,和多个null作为值(HashTbable键值有null就抛出NullPointException异常)
- HashTable不指定容量则默认11,扩容后2n+1;HashMap默认16,扩充2n
- HashMap总使用2的幂次方作为哈希表的大小,HashTable开始会使用指定大小
-
HashMap和HashTabl都是哈希表数据结构,都用链表解决冲突。
-
HashMap在JDK1.8之后解决哈希冲突变化:当链表长度大于阈值(默认8)时,将链表转化为红黑树,以减少搜索时间。
6、HashMap和HashSet的区别
- HashSet底层是基于HashMap实现的,只有clone、writeObject、readObject是自己实现的
HashMap | HashSet |
---|---|
实现了Map接口 | 实现了Set接口 |
键值对储存 | 只储存值 |
添加put() | 添加元素add() |
使键计算Hashcode | 使用成员对象计算 |
7、HashSet如何检查重复
待更新 复述了JAVAGUIDE