今天讲的这个小问题,没有用过 PyCharm 的同学会完全不知所云,但用过的人,可能有一半以上概率会遇到这个算不上 bug 但也可能让人迷惑的坑。...情况就是:当你写了一段代码,点击 PyCharm 右上角的绿色小三角运行程序时,发现结果跟你预期的完全不相干。然后,无论你怎么修改代码,结果丝毫不会改变。甚至你一怒之下删光所有代码,竟然仍有输出!...其实原因也很简单:在 PyCharm里面,切换了当前编辑的 py 文件后,默认运行的代码文件是不会跟着变的。这时候用快捷键或者点运行按钮执行的都还是一开始设定的那个代码文件。 ?...或者在设置里重新设定下 run context configuration 的快捷键,用这个快捷键来运行,就会是当前的 py 文件了。...不过这样一来,如果你不是写单个文件的代码,而是开发有固定执行入口的项目,就反倒不方便了。所以具体就看你自己的需要了。 ?
引言 前几天有个读者由于看了《ArrayList哪种遍历效率最好,你真的弄明白了吗?》问了个问题普通for循环ArrayList为什么不能删除连续重复的两个元素?其实这个描述是不正确的。...正确的应该是普通for循环正序删除,不能删除连续的元素所以就产生了这个文章。 ? ArrayList删除数据的方式 我们先看下ArrayList总共有几种删除元素的方法吧。...,使用ArrayList的remove()方法删除 * 可以删除 结果不正确 * @param list * @param predicate */ public...可以删除但是结果不正确的方法for循环正序删除(deleteByOrder) 先来张图吧,看图更直观。...总结 上面列举了一系列的删除方法,稍不小心使用不当就踩坑里面了。这么多我也记不住啊?最好的方法就是不要边循环边删除数据。如果非要删除咧?
前言 JDK源码解析系列文章,都是基于JDK8分析的,虽然JDK14已经出来,但是JDK8我还不会,我… 类图 ?...为了防止c.toArray()方法不正确的执行,导致没有返回Object[],特殊做了处理 如果数组大小等于0,则使用 EMPTY_ELEMENTDATA 那么问题来了,什么情况下c.toArray(...而java.util.Arrays的私有内部类ArrayList的toArray()方法可能不返回Object[]。 为什么会这样?...所以ArrayList,for循环遍历效率也是很高的。...我将ArrayList的类注释大概翻译整理了一下: ArrayList是实现List接口的可自动扩容的数组。实现了所有的List操作,允许所有的元素,包括null值。
二胖: 啊,没有啊我这是第一次来这。 面试官: 行,那我们开始今天的面试吧,刚开始我们先来点简单的吧,java里面的容器你知道哪些啊,跟我说一说吧。...面试官: 那我们今天的面试就先到这了,我待会还有一个会,后续如有通知人事会联系你的。 以上故事纯属虚构如有雷同请以本文为主。...为什么要引入COW 防止ConcurrentModificationException异常 在java里面我们如果采用不正确的循环姿势去遍历List时候,如果一边遍历一边修改抛出java.util.ConcurrentModificationException...如果对ArrayList循环遍历不是很熟悉的可以建议看下这篇文章《ArrayList的删除姿势你都掌握了吗》 List list = new ArrayList();...[] array; 从源码中我们可以知道CopyOnWriteArrayList这和ArrayList底层实现都是通过一个Object的数组来实现的,只不过 CopyOnWriteArrayList的数组是通过
**面试官:** 那我们今天的面试就先到这了,我待会还有一个会,后续如有通知人事会联系你的。 **以上故事纯属虚构如有雷同请以本文为主。...为什么要引入COW 防止ConcurrentModificationException异常 在java里面我们如果采用不正确的循环姿势去遍历List时候,如果一边遍历一边修改抛出java.util.ConcurrentModificationException...如果对ArrayList循环遍历不是很熟悉的可以建议看下这篇文章《ArrayList的删除姿势你都掌握了吗》 List list = new ArrayList();...线程安全的容器 我们再看下面一个栗子一个线程往List里面添加数据,一个线程循环list读数据。...[] array; 从源码中我们可以知道CopyOnWriteArrayList这和ArrayList底层实现都是通过一个Object的数组来实现的,只不过 CopyOnWriteArrayList的数组是通过
= 0) { // c.toArray可能(不正确)不返回Object [] // jdk bug(Arrays内部实现的ArrayList的toArray...而`java.util.Arrays`的私有内部类ArrayList的`toArray()`方法可能不返回 `Object[]` 为什么会有这种情况呢,我们看 ArrayList 的 `toArray...所以,在这种情况下, c.toArray() 可能(不正确)不返回Object []。...**底层数据结构:** `Arraylist` 底层使用的是 **`Object` 数组**;`LinkedList` 底层使用的是 **双向链表** 数据结构(JDK1.6 之前为循环链表,JDK1.7...所以ArrayList,for循环遍历效率也是很高的。
= 0) { // c.toArray可能(不正确)不返回Object [] // jdk bug(Arrays内部实现的ArrayList的toArray...而java.util.Arrays的私有内部类ArrayList的toArray()方法可能不返回 Object[] 为什么会有这种情况呢,我们看 ArrayList 的 toArray() 方法源码:...所以,在这种情况下, c.toArray() 可能(不正确)不返回Object []。...数组;LinkedList 底层使用的是 双向链表 数据结构(JDK1.6 之前为循环链表,JDK1.7 取消了循环。...所以ArrayList,for循环遍历效率也是很高的。
大家好,又见面了,我是你们的朋友全栈君。 增强for循环 为什么需要增强for循环呢? 简化数组和集合的遍历。...想要使用增强for循环必须先要了解它的格式 增强for循环的格式 for(数据类型 变量名 : 数组或者集合对象){ //循环体,变量即元素 } 注意: 增强for的底层依赖的是迭代器...obj : list ){ System.out.println(obj); } }//结果: 10,20,30,40,50 泛型 概念:即泛指任意类型,又叫参数化类型,对具体的使用起到辅助作用...(10);这里运行时会报类型转换异常 //遍历集合 for (Object object : list) { String s = (String) object;//想要通过String...类型接收必须先强制类型转换 System.out.println(s);//结果a b c } //需求:使用泛型 //1.创建集合对象 //从jdk1.7开始后边的泛型可以省略不写
简介 或许有很多小伙伴都尝试过如下的代码: ArrayList list = ...; for (Object object : list) { if (条件成立) {...增强for循环的代码如下 for (Object object : list) { // 操作 } 其实增强for循环就是使用Iterator迭代器进行迭代的,增强for循环就变成下面这样: Iterator... iterator = list.iterator(); while (iterator.hasNext()) { iterator.next(); // 操作 } 那么为什么在增强...现在把文章开头的代码拷下来,再来分析一次: ArrayList list = ...; for (Object object : list) { if (条件成立) {...()) { iterator.next(); iterator.remove(); } 总结 本来我还不知道增强for循环是调用Iterator进行迭代的,要不是我debug了一波,我还不知道呐
我们期望结果是剩余元素打印:1 运行程序看一下: 从运行结果中可以看到,程序并没有得到我们期望的结果,为什么?...先不做解释,看下图: 图中我们演示了循环删除元素的执行步骤,导致程序运行结果和我们预期不一致的原因,有一个很关键的点,就是for循环中i < list.size(),因为随着我们移除元素...看到了下表越界异常,为什么,继续看下图: 那么list中循环移除元素就无解了吗?...中的remove方法移除lastRet位置的元素 为什么Iterator能够安全的移除元素呢?...操作确实影响到了原来的list,为什么呢?
Java常用API(ArrayList类) 我们为什么要使用ArrayList类?...这里java给我们提供的包装类,(所谓包装类就是将基本数据类型包装为对象)后面我在写一篇文章展开详细的叙述 ? 构造方法献上: public ArrayList() :构造一个内容为空的集合。...结果 ?...System.out.println(arrayList); } } 结果 ?...以上就是一些基本的关于ArrayList的内容,如有不正确或则不完善的地方还请各位批评指教
比如说:Java 程序员最常犯的错竟然是这 10 个,像这类令人好奇心想害死猫的主题,非常值得扒出来给大家分享一下。 ? PS:别问我“为什么标题要加上‘惊呆了’?”...问了答案就只有一个——吓唬人——总得勾起大家的阅读兴趣嘛(我容易吗我)。下面开始正文。...03、通过 for 循环删除列表中的元素 新手特列喜欢使用 for 循环删除列表中的元素,就像这样: List list = new ArrayList(Arrays.asList...,但结果呢: [默, 二] 竟然还有两个元素没删除,why?...至于 List 和 List 之间的区别,查看我写的另外一篇文章:《为什么不应该使用Java的原始类型》。
今天我才了解到 Java 还有 fail-fast 一说。不得不感慨啊,学习真的是没有止境。只要肯学,就会有巨多巨多别人眼中的“旧”知识涌现出来,并且在我这全是新的。 能怎么办呢?...02、for each 中集合的 remove 操作 很长一段时间里,我都不明白为什么不能在 for each 循环里进行元素的 remove。今天我们就来借机来体验一把。...在 for each 循环中,集合遍历其实是通过迭代器 Iterator 配合 while 循环实现的,但是元素的 remove 却直接使用的集合类自身的方法。...04、怎么避开 fail-fast 保护机制呢 通过上面的分析,相信大家都明白为什么不能在 for each 循环里进行元素的 remove 了。 那怎么避开 fail-fast 保护机制呢?...该异常可能由于检测到对象在并发情况下被修改而抛出的,而这种修改是不允许的。 通常,这种操作是不允许的,比如说一个线程在修改集合,而另一个线程在迭代它。这种情况下,迭代的结果是不确定的。
= null) { while (it.hasNext()) { //这个元素的类 需要重写 equals() 方法,不然结果够呛 if...> it = iterator(); while (it.hasNext()) { //排除异己,不在我集合中的统统 886 if (!... toArrayList() { ArrayList result = new ArrayList(size()); for (E entry...16 倍,为什么是 16 呢?...为什么不定义为抽象方法?
上面为什么要多此一举使用Arrays.copyOf(elementData, size, Object[].class)复制一遍数组呢?...ArrayList 底层基于数组实现,所以它可在常数阶的时间内完成随机访问,效率很高。对 ArrayList 进行遍历时,一般情况下,我们喜欢使用 foreach 循环遍历,但这并不是推荐的遍历方式。...遍历时删除 遍历时删除是一个不正确的操作,即使有时候代码不出现异常,但执行逻辑也会出现问题。关于这个问题,阿里巴巴 Java 开发手册里也有所提及。...初看这个执行结果确实很让人诧异,不明原因。如果死抠上面的代码,我们很难找出原因,此时需要稍微转换一下思路。...归根结底,上面的代码段没抛异常的原因是,循环提前结束,导致 next 方法没有机会抛异常。
} 但是,如果不小心把条件写错了,变成这样的: for(int i=0; i>10; i++) { System.out.println(i); } 结果就悲剧了,必定会出现死循环,因为循环中的条件变成恒等的了...很多朋友看到这里,心想这种错误我肯定不会犯的。不过我需要特别说明的是,这里举的例子相对来说比较简单,如果i>10这里是个非常复杂的计算,还真说不准一定不会出现死循环。...1.2 不正确的continu for语句在循环遍历数组和list时更方便,而while语句的使用场景却更多。...对spring循环依赖问题有兴趣的朋友,可以看看我之前写的一篇文章《spring:我是如何解决循环依赖的?》。...1.3 自己写的死循环要注意什么? 不知道聪明的小伙伴们有没有发现,我们自定义的定时任务和生产者消费者例子中,也写了死循环,但跟上面其他的例子都不一样,我们写的死循环没有出现问题,这是为什么?
遍历集合的方式也有很多,比如for循环、while循环、foreach循环、Iterator等。这里的Iterator就是我们设计模式里面的迭代器模式。...private ArrayList arrayList = new ArrayList(); @Override public void add(Object object)...异常 那么问题来了,为什么会有这个异常信息呢?...符合单一职责原则以及开闭原则 可以对遍历进行把控暂停或者继续 总结 迭代器设计模式在我们业务场景中自己写的代码中 我个人是觉得比较少见的,至少到目前我还没有怎么发现有好的业务场景可以用这个模式,所以这里我就不给大家举例业务代码改造了...今天的迭代器模式到此结束,我是敖丙,你知道的越多,你不知道的越多,我们下期见!!!
大家好,我是田哥 在我们实际开发中,List应该是使用最多的集合之一,既然用的多,那我们就应该重视,免得出bug。...如果不正确操作也不支持增删操作 在第二个坑的时候,我们说到了 Arrays.asList 返回的 List 不支持增删操作, 是因为他的自己实现了一个内部类 ArrayList,这个内部类继承了 AbstractList...但是第三个坑的时候,我们利用 java.util.ArrayList 包装了返回的 List,进行增删操作还是会失败,那是为什么呢?...我总结了四种方式 ArrayList中的 subList 强转 ArrayList 导致异常 阿里《Java开发手册》上提过 [强制] ArrayList的sublist结果不可強转成ArrayList...,循环1000次创建了1000个具有10万个元素的List 因为始终被collect.subList(0, 1)强引用,得不到回收 解决方式: 在subList方法返回SubList,重新使用new ArrayList
领取专属 10元无门槛券
手把手带您无忧上云