类集的一些问题

1.ArraryList,Vector,LinkedList的区别和关系

  • 三者都是List的接口的常用子类
  • ArraryList,Vector是基于数组实现的;LinkedList是基于链表实现的
  • ArraryList采用懒加载策略,扩容为原先数组的1.5倍,采用异步处理,线程不安全,性能较高;在频繁查找或者需要在尾部插入或者删除的时候使用
  • Vector当产生对象时就初始化内部数组(默认大小为10),扩容为原来的2倍,采用sychronized同步方法,线程安全,性能很低(读读互斥)
  • LinkedList采用异步处理,线程不安全,频繁在任意位置进行元素插入或者删除使用LinkedList

2.fail-fast与fail-safe

  • fail-fast快速失败策略

是java集合(Collection)中的一种错误检测机制,当在迭代集合的过程中该集合在结构上发生改变的时候,就有可能会发生fail-fast,即抛出ConcurrentModificationException异常。fail-fast机制并不保证在不同步的修改下一定会抛出异常,它只是尽最大努力去抛出,所以这种机制一般仅用于检测bug。

优先考虑出现异常的情况,当异常产生的时,抛出异常,程序终止

public class Main{
    public static void main(String[] args) {
        LinkedList linkedList = new LinkedList();
        for(int i = 0; i < 20; i++){
            linkedList.add(i + ",");
        }
        Iterator<String> iterator = linkedList.iterator();
        int i = 0;
        while (iterator.hasNext()){
            if(i == 7){
                linkedList.remove(7);
            }
            System.out.print(iterator.next());
            i++;
        }
    }
}


//以下是idea中抛出的异常
Exception in thread "main" java.util.ConcurrentModificationException
0,1,2,3,4,5,6,
  • 如何产生?

modCount!=expectedModCount

modCount记录当前集合修改(结构化修改)的次数

expectedModCount记录获取集合迭代器时当前集合的修改次数

当遍历的时候修改集合的内容两者的值会不相等,因此会抛出异常

ConcurrentModificationException作用:避免多线程场景下数据脏读问题

  •   ail-fast如何解决?

遍历不要修改集合内容

使用迭代器内部的删除方法

使用fail-safe集合

fail-fast集合:java.util除了TreeMap以外的所有集合

juc包的集合(ConcurrentHashMap、CopyOnWriteArrayList)都属于fail-safe

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值