c和c++哪个更容易上手_早期更多失败– Java 8

本文讨论了Java 8中集合类的迭代器快速失败特性,当在迭代过程中尝试修改基础数据结构时,会抛出`ConcurrentModificationException`。举例展示了在迭代期间调用`sort()`或`add()`、`remove()`操作会触发此异常。建议避免在迭代中修改数据结构,而是使用Lambda表达式或在迭代外进行排序以提高代码质量。
摘要由CSDN通过智能技术生成
c和c++哪个更容易上手

c和c++哪个更容易上手

快速失败早期失败是一种软件工程概念,旨在通过在不应该发生的事情发生时立即停止执行来防止发生复杂的问题。 在以前的博客文章演示中,我将详细介绍这种方法的优点,在这篇博客文章中,我将详细介绍Java 8中该思想的另一种用法。在Java中,由Collection类(例如ArrayList,HashSet,Vector等)返回的迭代器快速失败。 这意味着,如果您在迭代时尝试从基础数据结构中添加()或remove(),则会收到ConcurrentModificationException。 让我们来看看:

import static java.util.Arrays.asList;
List ints = new ArrayList<>(asList(1,2,3,4,5,6,9,15,67,23,22,3,1,4,2));
    
for (Integer i: ints) {
    // some code
    ints.add(57);  // throws java.util.ConcurrentModificationException
}

在Java 8u20中,Collections.sort()API也会快速失败。 这意味着您也不能在迭代内调用它。 例如:

import static java.util.Arrays.asList;
List ints = new ArrayList<>(asList(1,2,3,4,5,6,9,15,67,23,22,3,1,4,2));

    
for (Integer i: ints) {
    // some code
    Collections.sort(ints); // throws java.util.ConcurrentModificationException
}

这很有道理。 遍历数据结构并在迭代过程中对其进行排序不仅是反直观的,而且还可能导致不可预测的结果。 现在,您可以避免这种情况,并且如果在调用排序后立即中断,则不会出现异常。

import static java.util.Arrays.asList;
List ints = new ArrayList<>(asList(1,2,3,4,5,6,9,15,67,23,22,3,1,4,2));

    
for (Integer i: ints) {
    // some code
    Collections.sort(ints); // throws java.util.ConcurrentModificationException
    break;
}

但是,这几乎不是很棒的代码。 尝试避免使用旧的skool迭代,并尽可能使用Lambda。 但是,如果您遇到困难,只需在迭代之外进行排序

import static java.util.Arrays.asList;
List ints = new ArrayList<>(asList(1,2,3,4,5,6,9,15,67,23,22,3,1,4,2));
Collections.sort(ints);
    
for (Integer i: ints) {
    // some code
}

或使用添加时排序的数据结构。

Java 8版本20引入了Collections.sort()API的这一新行为。 值得看一下详细介绍API更改的特定部分:

区域:core-libs / java.util.collections简介:Collection.sort推迟到List.sort

以前, Collection.sort复制列表中的元素以将其排序到一个数组中,对该数组进行排序,然后使用该数组中的这些元素和默认方法就地更新列表。List.sort推迟到Collection.sort。 这是非最佳的安排。

从8u20版本开始, Collection.sort推迟到List.sort 。 这意味着,例如,使用ArrayList实例调用Collection.sort现有代码现在将使用ArrayList实现的最佳排序。

我认为,如果Oracle在此方面更明确地说明这种更改如何引起运行时问题,那将有所帮助。 考虑到每个人都使用Collections框架,如果以前没有抛出异常的API现在可以在相同情况下使用(错误代码及其全部内容),那么发行说明使开发人员更容易找到信息会更好。

翻译自: https://www.javacodegeeks.com/2017/11/fail-early-java-8.html

c和c++哪个更容易上手

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值