美文网首页
java集合框架List了解多少

java集合框架List了解多少

作者: happyevery_3ae2 | 来源:发表于2020-10-29 21:05 被阅读0次

第1集 编程语⾔⾯试题之新版javase集合框架List基础篇
简介:java集合框架⾥⾯List常⻅基础⾯试题
考查点:list的基础知识点掌握情况,对应的实现的区别,线程安全、使⽤场景
难度【
说下Vector和ArrayList、LinkedList联系和区别?分别的使⽤场景
答案:
线程安全
ArrayList:底层是数组实现,线程不安全,查询和修改⾮常快,但是增加和删除慢
LinkedList: 底层是双向链表,线程不安全,查询和修改速度慢,但是增加和删除速度快
Vector: 底层是数组实现,线程安全的,操作的时候使⽤synchronized进⾏加锁
使⽤场景
Vector已经很少⽤了
增加和删除场景多则⽤LinkedList
查询和修改多则⽤ArrayList
第2集 编程语⾔⾯试题之新版javase集合框架List 追杀篇《上》
简介:基于List进⾏继续追问,初试连环炮
考点: List的掌握情况(追问系列)
难度【

如果需要保证线程安全,ArrayList应该怎么做,⽤有⼏种⽅式
⽅式⼀:⾃⼰写个包装类,根据业务⼀般是add/update/remove加锁
⽅式⼆:Collections.synchronizedList(new ArrayList<>()); 使⽤synchronized加锁
⽅式三:CopyOnWriteArrayList<>() 使⽤ReentrantLock加锁
第3集 编程语⾔⾯试题之CopyOnWriteArrayList追杀篇《下》
简介:基于CopyOnWriteArrayList进⾏继续追问
考点: CopyOnWriteArrayList的掌握情况(追问系列)
难度【**
如果回答到上⾯的点则继续问,没回到到则问,了解CopyOnWriteArrayList吗?和
Collections.synchronizedList实现线程安全有什么区别, 使⽤场景是怎样的?
CopyOnWriteArrayList:执⾏修改操作时,会拷⻉⼀份新的数组进⾏操作(add、set、
remove等),代价⼗分昂贵,在执⾏完修改后将原来集合指向新的集合来完成修改操作,源
码⾥⾯⽤ReentrantLock可重⼊锁来保证不会有多个线程同时拷⻉⼀份数组
场景:读⾼性能,适⽤读操作远远⼤于写操作的场景中使⽤(读的时候是不需要加锁的,
直接获取,删除和增加是需要加锁的, 读多写少)
Collections.synchronizedList:线程安全的原因是因为它⼏乎在每个⽅法中都使⽤了
synchronized同步

场景:写操作性能⽐CopyOnWriteArrayList好,读操作性能并不如
CopyOnWriteArrayList
CopyOnWriteArrayList的设计思想是怎样的,有什么缺点?
答案:设计思想:读写分离+最终⼀致
缺点:内存占⽤问题,写时复制机制,内存⾥会同时驻扎两个对象的内存,旧的对象和新写⼊的对象,
如果对象⼤则容易发⽣Yong GC和Full GC
第4集 源码剖析之新版javase扩容机制List暗器篇
简介:基于List进⾏继续⼆次追问,进阶扩容机制+源码剖析
考点:List集合扩容机制
难度【
* **】
说下ArrayList的扩容机制是怎样的
注意:JDK1.7之前ArrayList默认⼤⼩是10,JDk1.7之后是0
未指定集合容量,默认是0,若已经指定⼤⼩则集合⼤⼩为指定的;
当集合第⼀次添加元素的时候,集合⼤⼩扩容为10
ArrayList的元素个数⼤于其容量,扩容的⼤⼩= 原始⼤⼩+原始⼤⼩/2
源码解读 JDK ArrayList 扩容核⼼源码
调试代码

List<String> list = new ArrayList<>();
for(int i=0;i<10;i++){
 list.add(""+i);
}
System.out.println(list.size());
list.add("xdclass.net");
System.out.println(list.size());

第5集 编程语⾔⾯试题之新版JDK⼿写ArrayList⼤招篇《上》
简介:基于List进⾏继续追问,进阶连环炮,代码实战
考点:源码设计思想、代码编写规范
难度【** *
设计⼀个简单的ArrayList【需要包含 构造函数(有参和⽆参)、add(obj)、 扩容机制】
//计算容量+确保容量
private void ensureCapacityInternal(int minCapacity){
//如果是初次扩容,则使⽤默认的容量
if(elementData == EMPTY_ELEMENT_DATA){
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
}
//是否需要扩容,需要的最少容量⼤于现在数组的⻓度则要扩容
if(minCapacity - elementData.length > 0){
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity>>1);
//如果新容量 < 最⼩容量, 则讲最新的容量赋值给新的容量
if(newCapacity - minCapacity < 0){
newCapacity = minCapacity;
}
//创建新数组
Object[] objects = new Object[newCapacity];
//将旧的数组复制到新的数组⾥⾯
System.arraycopy(elementData,0, objects,0,elementData.length);
//修改引⽤
elementData = objects;
}
}
第6集 编程语⾔⾯试题之新版JDK⼿写ArrayList⼤招篇《下》
简介:基于List进⾏继续追问,进阶连环炮,代码实战
考点:源码设计思想、代码编写规范
难度【
* **】
设计⼀个简单的ArrayList【remove(index)、get(index) 、indexOf(o) ,set(int index,Object obj)】
System.arraycopy(Object src, int srcPos, Object dest, int destPos,int length)
参数介绍
Object src : 原数组
int srcPos : 从元数据的起始位置开始
Object dest : ⽬标数组
int destPos : ⽬标数组的开始起始位置
int length : 要copy的数组的⻓度

相关文章

网友评论

      本文标题:java集合框架List了解多少

      本文链接:https://www.haomeiwen.com/subject/ehmlvktx.html