首页 > 代码库 > Java链表的删除操作
Java链表的删除操作
刚开始接触java时很长一段时间, 总觉得java链表的删除操作自己写的有bug。
第一个bug版本:
仅接removeByForlist.remove(j)之后应该显示调用i--
public static void testRemoveByFor() { List<Integer> removeByForlist = Lists.newArrayList(1, 1, 1, 1, 1, 1, 1, 1, 1, 1); System.out.println(ToStringBuilder.reflectionToString(Joiner.on("").join(removeByForlist))); for (Integer i = 0; i < removeByForlist.size(); i++) { Integer j = removeByForlist.get(i); if (j.equals(1)) { removeByForlist.remove(j); } } System.out.println(ToStringBuilder.reflectionToString(Joiner.on("").join(removeByForlist))); } public static void main(String[] args) { testRemoveByFor(); } 输出结果: java.lang.String@35718057[value=http://www.mamicode.com/{1,1,1,1,1,1,1,1,1,1},hash=2075774624]>第二个bug版本:
首先介绍一下fail-fast: fail-fast 机制是java集合(Collection)中的一种错误机制。 当多个线程对同一个集合的内容进行操作时,就可能会产生 fail-fast 事件。例如:当某一个线程A通过 iterator 去遍历某集合的过程中,若该集合的内容被其他线程所改变了;那么线程A访问集合时,就会抛出ConcurrentModificationException 异常,产生 fail-fast 事件。这种设计模式原则是与其留下隐患,不如最初就直接拒绝。这就好比有时我们做人一样,有时需要干脆的拒绝他人。
<p><strong> <span> <strong style="line-height: 1.5;"> <span style="line-height: 1.5; background-color: #ff0000;"></span> </strong> </span> </strong></p><span style="color:#ff9900;"><strong> </strong></span>public static void testRemoveByForeach() { List<Integer> removeByForeach = Lists.newArrayList(1, 1, 1, 1, 1, 1, 1, 1, 1, 1); System.out.println(ToStringBuilder.reflectionToString(Joiner.on("").join(removeByForeach))); for(Integer i : removeByForeach){ removeByForeach.remove(i); } System.out.println(ToStringBuilder.reflectionToString(Joiner.on("").join(removeByForeach))); } public static void main(String[] args) testRemoveByIterator(); } 输出结果: java.lang.String@35718057[value=http://www.mamicode.com/{1,1,1,1,1,1,1,1,1,1},hash=2075774624]>
第三个正确版本:public static void testRemoveByIterator() { List<Integer> removeByIterator = Lists.newArrayList(1, 1, 1, 1, 1, 1, 1, 1, 1, 1); System.out.println(ToStringBuilder.reflectionToString(Joiner.on("").join(removeByIterator))); Iterator<Integer> iterator = removeByIterator.iterator(); int i = 0; while (iterator.hasNext()) { Integer next = iterator.next(); if (next.equals(1)) { iterator.remove(); } } System.out.println(ToStringBuilder.reflectionToString(Joiner.on("").join(removeByIterator))); } public static void main(String[] args) { testRemoveByIterator(); } 输出结果: java.lang.String@2ea0eb2a[value=http://www.mamicode.com/{1,1,1,1,1,1,1,1,1,1},hash=2075774624]>
Java链表的删除操作
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。