我正在ConcurrentModificationException
使用以下代码测试集合:
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
list.add("c");
for (String s : list) {
// if (s.equals("a")) { // ConcurrentModificationException!
if (s.equals("b")) { // -->> Magic number, NO Exception, Why?
// if (s.equals("c")) { // ConcurrentModificationException!
list.remove(s);
}
}
System.out.println(list);
}
我不明白为什么删除“ b”可以,但是其他NG?
首先要知道的是(如JLS所述)以下增强的for循环:
for (String s : list) {
// Do something with s
}
等效于:
for (Iterator<String> it = list.iterator(); it.hasNext();) {
String s = it.next();
// Do something with s
}
如果查看中的迭代器的实现AbstractList
,您将看到:
hasNext()
不检查并发修改,仅使用大小检查我们是否在列表的末尾: public boolean hasNext() {
return cursor != size();
}
next()
是调用checkForComodification()
以查看在迭代过程中列表是否被修改: public E next() {
checkForComodification();
try {
E next = get(cursor);
lastRet = cursor++;
return next;
} catch (IndexOutOfBoundsException e) {
checkForComodification();
throw new NoSuchElementException();
}
}
final void checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}
因此,当您迭代并删除列表的倒数第二个元素时,下一条指令将是对的调用hasNext()
,该调用将返回false
,因为删除一个元素会导致列表的大小减小一倍,并且您的迭代将停止而无需调用next()
并抛出一个Exception
。
顺便说一下,所有这些都只是实现细节,您不应该依赖它,因为它可以更改,并且it.remove()
在迭代时可以从列表中删除元素。
实际上MATLAB提供了一个函数可以计算出任意规格的魔方矩阵,毫不奇怪,这个函数就是magic. B = magic(4) B = 16 2 3 13 5 11 10 8 9 7 6 12 4 14 15 1 与刻在杜勒的木板上的那个矩阵差不多一样,具有相同的性质。
在 Python 中,定义函数和调用函数都很简单,但如何定义函数参数和传递函数参数,则涉及到一些套路了。总的来说,Python 的函数参数主要分为以下几种: 必选参数 默认参数 可变参数 关键字参数 必选参数 必选参数可以说是最常见的了,顾名思义,必选参数就是在调用函数的时候要传入数量一致的参数,比如: >>> def add(x, y): # x, y 是必选参数 ...
介绍 魔方+是魔方加密为高级开发者提供的增值服务。 魔方+主要适合于: 企业开发者 需要经常进行加密的开发者 Discuz! 模板开发者 希望使用经过长时间线上考验的 Panda · 第一代加密引擎的开发者 希望使用文件认证模板功能的开发者 其它希望购买魔方+的开发者 购买魔方+后,在服务期限内: 加密文件不收取费用 可以加密 Discuz! 模板 可以选用 Panda 和 Crane 两套加密引
我想编程一个魔术广场,其中数组的利用率是在地方,但当我想运行它,它显示我该怎么办?它会显示 我还应该从这个程序中添加或删除什么?
4.1 重新认识函数 我们先不谈 Python 中的函数定义,因为将定义放在章节的首要位置,这明显就是懒得把事情讲明白的做法,相信你在阅读其他教材时对这点也深有体会。而我要说的是,经过第一章的阅读与训练,其实你早已掌握了函数的用法: 通过观察规律其实不难发现,Python 中所谓的使用函数,就是把你要处理的对象放到一个名字后面的括号里。简单来说,函数就是这么使用的,往里面塞东西就可以得到处理结果。
我们既蒙怜悯,受了这职分,就不丧胆,乃将那些暗昧可耻的事弃绝了,不行诡诈,不谬讲神的道理,只将真理表明出来,好在神面前把自己荐与各人的良心。(2 CORINTHIANS 4:1-2) 黑魔法 围绕类的话题,真实说也说不完,仅特殊方法,除了前面遇到过的__init__(),__new__(),__str__()等之外,还有很多。虽然它们仅仅是在某些特殊情景中使用,但是,因为本教程是“From Beg