Fail-Fast 前奏

2023-12-21 07:18
文章标签 fail fast 前奏

本文主要是介绍Fail-Fast 前奏,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

示例代码1

public static void main(String[] args) {String string = "a b c d e";List<String> stringList = Arrays.asList(string.split(" "));Iterator<String> iterator = stringList.iterator();while (iterator.hasNext()) {if(iterator.next().equals("c")) {stringList.remove("c");}}
}

输出:

Exception in thread "main" java.lang.UnsupportedOperationExceptionat java.util.AbstractList.remove(AbstractList.java:161)at java.util.AbstractList$Itr.remove(AbstractList.java:374)at java.util.AbstractCollection.remove(AbstractCollection.java:293)at DotThis.main(DotThis.java:75)

报不支持的操作异常,UnsupportedOperationException。
ArrayList.asList返回的List是固定大小的List,也就是说不可以对其进行add、remove操作。
源码如下:

//Returns a fixed-size list backed by the specified array.
@SafeVarargs
@SuppressWarnings("varargs")
public static <T> List<T> asList(T... a) {return new ArrayList<>(a);
}//该ArrayList类不是java.util包中的内容,而是Arrays类的内部类。
private static class ArrayList<E> extends AbstractList<E>implements RandomAccess, java.io.Serializable
{private static final long serialVersionUID = -2764017481108945198L;private final E[] a;ArrayList(E[] array) {a = Objects.requireNonNull(array);}/*省略此处代码*/
}

从上面代码的注释中可以看到是 “返回的是固定大小的List”。从源码实现上可以看到,private final E[] a; ,内部类ArrayList中的成员变量a,是final的。

示例代码二

public static void main(String[] args) {String string = "a b c d e";List<String> arrList = Arrays.asList(string.split(" "));List<String> stringList = new ArrayList<String>(arrList);Iterator<String> iterator = stringList.iterator();while (iterator.hasNext()) {if(iterator.next().equals("c")) {stringList.remove("c");}}
}

输出:

Exception in thread "main" java.util.ConcurrentModificationExceptionat java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)at java.util.ArrayList$Itr.next(ArrayList.java:851)at DotThis.main(DotThis.java:76)

每个容器源码都会有modCount,modCount用来表示容器被结构性修改的次数。所谓结构性修改是指,改变了容器的size,或者在迭代过程中产生了不正确的结果。

代码中,在迭代到”c”时,stringList.remove(“c”); 执行了remove操作,对list造成了结构性修改,改变了list的size,modCount的值会加1。
这样当迭代到”d”时,发现expectedModCount与modCount不等了,因此抛ConcurrentModificationException异常了。

示例代码三

public static void main(String[] args) {String string = "a b c d e";List<String> stringList1 = Arrays.asList(string.split(" "));List<String> stringList = new ArrayList<String>(stringList1);System.out.println(stringList);Iterator<String> iterator = stringList.iterator();while (iterator.hasNext()) {if(iterator.next().equals("c")) iterator.remove();//这里跟上例不同,上例为stringList.remove("c");}}System.out.println(stringList);
}

输出:

[a, b, c, d, e]
[a, b, d, e]

查看ArrayList#Itr#remove方法:

private class Itr implements Iterator<E> {public void remove() {if (lastRet < 0)throw new IllegalStateException();checkForComodification();try {ArrayList.this.remove(lastRet);cursor = lastRet;lastRet = -1;expectedModCount = modCount;} catch (IndexOutOfBoundsException ex) {throw new ConcurrentModificationException();}}final void checkForComodification() {if (modCount != expectedModCount)throw new ConcurrentModificationException();}/**省略此处代码**/    
}

从上面代码可以看到,首先也判断了expectedModCount与modCount是否相等,但是这时还没有执行remove操作,因此不会抛异常。在执行了ArrayList.this.remove(lastRet); 之后,有一个关键的一行expectedModCount = modCount; 更新了expectedModCount的值。

这篇关于Fail-Fast 前奏的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/519072

相关文章

每天一道面试题(2):fail-safe 机制与 fail-fast 机制分别有什么作用?

当谈论Java集合的 fail-fast 和 fail-safe 机制时,涉及的是在集合被并发修改时的行为和处理方式。这些机制对保证程序的正确性和稳定性非常重要,尤其是在多线程环境中。 1. Fail-Fast 机制 定义: Fail-fast 机制的核心是在检测到集合在遍历过程中被修改时,立即抛出 ConcurrentModificationException 异常,从而中断迭代操作。这种

数据清洗:信息时代的黄金前奏

数据清洗:信息时代的黄金前奏 在当今这个数据驱动的时代,信息已成为社会发展的重要资源。企业、政府乃至个人,都依赖于数据分析来指导决策、优化流程、预测趋势。然而,在数据从产生到应用的整个链条中,一个至关重要的环节往往被忽视或低估,那就是数据清洗(Data Cleaning)。数据清洗,作为数据预处理的核心步骤,其重要性不言而喻,它是确保数据质量、提升数据分析准确性与效率的关键所在。 一、数据清洗

UVa 11992 Fast Matrix Operations 线段树

UVa 11992 Fast Matrix Operations 题目大意:有一个r行c列的全0矩阵,支持三种操作: 1 x1 y1 x2 y2 v 子矩阵(x1,y1,x2,y2)的所有元素增加v(v > 0)。 2 x1 y1 x2 y2 v 子矩阵(x1,y1,x2,y2)的所有元素设为v(v > 0)。 3 x1 y1 x2 y2    查询子矩阵(x1,y1,x2,y2

【HDU】4965 Fast Matrix Calculation 矩阵快速幂

传送门:【HDU】4965 Fast Matrix Calculation 题目分析:因为比赛的时候写的太匆忙。。写的不堪入目,所以赛后重写了一次,顺便就贴一下了。 因为A*B=C,所以C^(N*N-1) = A*B*A*B*A*...*B*A*B,因为满足结合律所以变成A*( (B*A)^(N*N-2) )*B,因为中间得到的矩阵最大不超过K(K<=6),所以可以对中间的矩阵快速幂,然

Fast Image Cache

https://github.com/path/FastImageCache   Fast Image Cache is an efficient, persistent, and—above all—fast way to store and retrieve images in your iOS application. Part of any good iOS applica

NCBI-get-GCFIDs_fast.py

import requestsimport osimport redef download_genome_first(gcf_id):# 构建FTP下载路径base_url = "https://ftp.ncbi.nlm.nih.gov/genomes/all/GCF/"# 提取GCF号的数字部分并按三位分割parts = gcf_id.split('_')[1] # 提取数字部分path_

Fast Power

Calculate the an % b where a, b and n are all 32bit non-negative integers. Example For 231 % 3 = 2 For 1001000 % 1000 = 0 Challenge O(logn) 思想:recursion算一半,然后base case,处理算完一半以后的情况; 公式就是 (a*b) %

getLocation:fail, the permission value is offline verifying

getLocation:fail, the permission value is offline verifying 后端会根据appid和secret生成 签名,前端wx配置时一定用appid来验证签名的正确 本次错误为配置初始化失败:前端与后端的appId不一致,我的失误也

fast-voice-assistant

首先我们来到这个据说50行代码就可以创建个人语音助手的github地址GitHub - dsa/fast-voice-assistant: ⚡ Insanely fast AI voice assistant with <500ms response times 按照readme 完成环境的配置 but,你发现,这只是第一步,真正的难点在于完成.env中各个key的配置 1)Using th

[目标检测]Fast RCNN算法详解

转载来自:http://blog.csdn.net/shenxiaolu1984/article/details/51036677 继2014年的RCNN之后,Ross Girshick在15年推出Fast RCNN,构思精巧,流程更为紧凑,大幅提升了目标检测的速度。在Github上提供了源码。 同样使用最大规模的网络,Fast RCNN和RCNN相比,训练时间从84小时减少为9.5小时