愿景:"让编程不再难学,让技术与生活更加有趣"
更多架构课程请访问 xdclass.net
目录
第1集 编程语言面试题之新版javase集合框架List基础篇
第2集 编程语言面试题之新版javase集合框架List 追杀篇《上》
第3集 编程语言面试题之CopyOnWriteArrayList追杀篇《下》
第4集 源码剖析之新版javase扩容机制List暗器篇
第5集 编程语言面试题之新版JDK手写ArrayList大招篇《上》
第6集 编程语言面试题之新版JDK手写ArrayList大招篇《下》
干货文档
第1集 编程语言面试题之新版javase集合框架List基础篇
简介:java集合框架里面List常见基础面试题
第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进行继续二次追问,进阶扩容机制+源码剖析
- 源码解读 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的数组的长度
干货文档





|