集合框架
集合相关面试题
1、List接口、Set接口,Map接口
2、ArrayList和LinkedList的异同
相同点:
1)都是先List接口,可排序、重复、单独访问
2)所用方法的使用是一样的
不同点:
1)数据结构不同
ArrayList一维数组
LinkedList是双向链表
2)性能不同
ArrayList
有点:查询速度快
缺点:插入和删除速度慢,因为要移动大量的数据
LinkedList
优点:插入和删除速度快,因为只需要修改上一个、下一个节点的地址
缺点:查询速度慢,因为需要一个个向后或向前查找
LinkedList在集合开头和结束位置插入和删除比较快,在中间位置比较慢,因为定位中间位置需要大量时间。一般开发时,查询的需求远大于插入和删除,一般情况瞎都是用ArrayList。
3、ArrayList和Vector的异同
相同点:
数据结构和用法相同
不同点:
ArrayList是非线程同步(安全)的,适合单线程使用
Vector是线程同步的,适合多线程使用
线程同步会降低程序性能,ArrayList性能高于Vector
4、ArrayList的源码
数据结构是什么
transient Object[] elementData;
默认容量是多少
private static final int DEFAULT_CAPACITY = 10;
如何扩容的
private void grow(int minCapacity) {
// 获得原来数组的长度
int oldCapacity = elementData.length;
// oldCapacity >> 1 相当于除以2,新容量是原来容量的1.5倍
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// 把旧数据数据复制到新数组中,替换原来数组
elementData = Arrays.copyOf(elementData, newCapacity); }
HashMap相关
HashMap的基本用法
put(键,值)
值 get(键)
将自定义类型作为键
练习:
定义司机类,属性:姓名、年龄、性别
定义汽车类,属性:品牌、颜色、价格
创建HashMap集合,将司机作为键,汽车作为值添加到集合中
测试通过司机对象从集合查找汽车
问题:默认情况下,Map集合通过键的内存地址来查找值,如何通过键对象的属性来
查找值,而不是键的内存查找。
解决方法:
给作为键的类,重写
int hashCode 返回整数,该整数是通过对象的属性值计算出来的
boolean equals 返回当前对象和参数是否相等(默认比较内存地址)重写后比较是属性值
注意:作为Map的键,必须要重写hashCode和equals方法
HashMap的原理
数据结构:
一维数组+单项链表
优点:数组的查找速度快、操作方便
如何保存数据的:
1、计算键的hashCode,将该整数算出数组的下标
2、通过下标找到数组上的数据(键值对)
哈希碰撞(通过不同的属性值,算出同一个整数)
3、如果该位置上没有数据,直接将新数据添加到该位置
4、如果该位置上有数据,将已有数据的键和新加数据的键调用equals方法进行比较
5、如果equals返回true,将新的值覆盖原来的值
6、如果equals返回false,将新键放到原来键的后面,如果之前还有数据,再往后放,直到末尾