类集复习(阅读部分源码)
1.ArrayList、Vector、LinkedList的关系与区别
- 以上三个类都是List接口下的常用子类,其中ArrayList与Vector基于数组实现,LinkedList基于双向链表实现
- ArrayList采用懒加载策略(第一次add时才初始化内部数组,默认初始化大小为10),扩容时扩容为原先数组的1.5倍,采用异步处理,线程不安全,性能较高。ArrayList在大部分场合(频繁查找、在集合末端插入与删除)都会使用到
- Vector在产生对象时就初始化内部数组为10,扩容时扩容为原先数组的2倍,采用synchronized修饰增删查改方法,线程安全性能较低(锁的力度太足,将当前集合对象锁住,导致读读都互斥),JDK内置的栈,是Vector的子类 用不到,性能太低
- LinkedList采用异步处理,线程不安全。在任意位置的频繁插入与删除时考虑使用,LinkedList是Queue接口的常用子类
2、什么的jcl中fail-fast机制?什么是fail-safe?
什么是快速失败?
优先考虑出现异常的情况,若异常产生,抛出异常,程序终止
jcl为何会产生ConcurrentModificationException?
if(modCount != exceptionModCount)
modCount 记录当前集合被修改(结构上)的次数
exceptionModCount 迭代器内部希望集合的修改次数(在获取集合迭代器时赋值,等于当前的集合修改次数)
意义: 避免多线程场景下的数据脏读问题,当有一个线程修改了数据,立马通知其他线程读取到过期的数据
java.util包下的直接子类 ArrayList、Vector、HashMap等都是fail-fast(除了TreeMap)
如何解决fail-fast:
a、多线程读,单线程写(在迭代遍历集合时,不要修改集合结构)
b、使用fail-safe 不抛出异常(juc包下的线程安全集合,如CopyOnWriteArrayList,ConcurrentHashMap等)
3、hashCode与equals的关系
hasnCode() :将任意一个对象根据指定的算法转为32位的int
equals():比较两个对象是否相等
equals相等的两个对象,hashCode是否相等 —— 一定相等
hashCode相等的两个对象,equals是否相等 —— 不一定相等
4、Java中实现一个类的两个对象的大小比较的两种方式(内部排序 外部排序)
内部排序:Comparable
若一个类实现了Comparable接口,表示该类具备天然的可比较特性
int compareTo(Object o)
- 返回 0 表示量对象相等
- 返回大于0 表示当期对象大于目标对象
- 返回小于0 表示当前对象小于目标对象
外部排序:Comparator
类本身不具备天然的可比较特性,专门有一个类来比较其大小关系——比较器实现 Comparator
int compare (Object o1, Object o2);