小心修改集合的大小

原创 2003年07月02日 16:12:00

小心修改集合的大小<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

       Java中最常使用的就是集合了,而且处于性能的考虑,现在大部分人都不再使用Vector这种方法同步的集合了。新的集合库带来了更快的性能,同时也带来了更多错误使用的可能。新集合库性能的提升主要就是去掉了方法同步,可想而知,同步访问时必然存在数据一致性问题。为了能使程序不会因为数据的不一致而造成其它错误,新集合库在设计时采用了快速失败机制(Fast-Fail),就是每次遍历集合时都会判断当前集合大小是否被修改,如果被修改,马上抛出ConcurrentModificationException异常,停止程序继续运行。因此集合初始化完成后,应避免在另一处被修改大小。看下面这个例子:

package com.bhr.ioat.testcollection;

import java.util.*;

public class TestRemove

{

       public static void main(String[] args)

       {

              Collection cltn = new ArrayList();

              for(int i=0; i<100000; i++){

                     cltn.add(new Integer(i));

              }

              new OtherThread(cltn).start();

              try{

                     Thread.sleep(1000); //sleep 1 second, in order to ensure the new thread start up.

              }catch(Exception e){

                            e.printStackTrace();

              }

              Iterator it = cltn.iterator();

              while(it.hasNext()){

                     Object obj = it.next();

                     cltn.remove(obj);

                     //it.remove();

                     System.out.println("Remove one element from collection");

                     break;

              }

 

       }

}

 

class OtherThread extends Thread

{

       public Collection cltn_;

       public OtherThread(Collection cltn){

              cltn_ = cltn;

              //cltn_ = (Collection)(((ArrayList)cltn).clone());

       }

 

       public void run(){

              Iterator it = cltn_.iterator();

              while(it.hasNext()){

                     Object obj = it.next();

                     System.out.println(obj);

              }

       }

 

}

程序很简单,开始初始化一个100000大小的ArrayList,然后传给另一个类,随后删除集合中的一个元素,你会发现马上就会抛出ConcurrentModificationException异常。

那是不是就不可以删除元素了?是不是应该继续使用Vector?当然不是,要不新集合的出现岂不是失去了意义。解决方法有两个,(1)集合只在一处被使用,这自然没有并发问题,不过还是不可以大胆修改,如果循环中删除集合中的元素,一定要调用Iteratorremove方法,而不是Collectionremove方法,前者删除后会修改Iterator的一个值,使得循环以为集合没被修改,可以继续进行,而调用后者没有修改Iterator中的值,继续循环同样会抛出异常。至于添加元素,Iterator中没有提供相应方法,所以如果在循环中添加,添加后就只能跳出循环了。(2)同一个集合在多处被使用,索性不要删除了,本来这种情况就不应该修改集合大小,如果你决得集合大小的修改不会影响程序的正常逻辑,那么使用时只好clone一个了。

上面只是实际中总结得一点经验,如果大家有更好得方法,可以交流一下,E-mail:zhvfeng@hotmail.com

 

Java提高篇(三五)-----Java集合细节(一):请为集合指定初始容量

集合是我们在Java编程中使用非常广泛的,它就像大海,海纳百川,像万能容器,盛装万物,而且这个大海,万能容器还可以无限变大(如果条件允许)。当这个海、容器的量变得非常大的时候,它的初始容量就会显得很重...
  • chenssy
  • chenssy
  • 2014年08月04日 19:19
  • 17541

常用集合的默认初始容量和扩容的原因

常用集合的默认初始容量和扩容的原因:        当底层实现涉及到扩容时,容器或重新分配一段更大的连续内存(如果是离散分配则不需要重新分配,离散分配都是插入新元素时动态分配内存),要将容器原来的数...
  • caiwanxia1
  • caiwanxia1
  • 2016年10月27日 21:00
  • 2413

【Java基础之集合(三)】集合对象比较大小和比较重复的区别和不同实现

Comparable接口:针对排序list   问题:上面的算法根据什么确定容器中对象的“大小”顺序? 所有可以“排序”的类都实现了java.lang.Comparable接口,Co...
  • cangchen
  • cangchen
  • 2015年04月09日 16:47
  • 1733

【YMGJ 3】APP--索引超出范围,必须为非负值并小于集合大小

索引超出范围,必须为非负值并小于集合大小                                                                               ...
  • u013067756
  • u013067756
  • 2016年07月16日 20:50
  • 1087

按指定大小,分隔集合,将集合按规定个数分为n个部分

/** * 按指定大小,分隔集合,将集合按规定个数分为n个部分 * * @param list * @param len * @return */ public static...
  • HUXU981598436
  • HUXU981598436
  • 2017年12月09日 17:05
  • 97

关于Java集合类迭代变量的修改

前几天和一个同事关于一个议题产生了疑虑:Java中对于
  • Enko_Wu
  • Enko_Wu
  • 2014年08月17日 15:00
  • 730

JAVA mongodb数据库连接、集合读取、集合大小

package mongodb; import java.net.UnknownHostException; import java.util.Iterator; import java.util....
  • MCpang
  • MCpang
  • 2013年03月25日 09:24
  • 13519

带团队就是带野心、带梦想、带欲望、 带状态!

带团队就是带野心、带梦想、带欲望、带状态;企业说到底是人,管理说到底是借力。失败的领导者以其一己之力解决众人问题,成功的领导者集众人之力解决企业问题。    经营企业的过程是一个借力的过程...
  • movexy
  • movexy
  • 2015年01月09日 10:45
  • 188

在list集合中的添加、修改、删除和遍历元素

集合与数组相似,但他的长度是可变的 list集合继承了collection接口,list集合的实现类是ArrayList()。 如下: package com.test; import j...
  • wangjunchao111
  • wangjunchao111
  • 2016年01月07日 16:56
  • 10532

小心笔试中的小陷阱(一)持续修改中~~

1.巧分sizeof(char a[])和strlen(char a[]) strlen():求的是字符串的实际长度,即不包括“\0”的长度,如strlen(“hello”)=5,而不是6,而且要特别...
  • moubao
  • moubao
  • 2013年08月06日 21:35
  • 436
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:小心修改集合的大小
举报原因:
原因补充:

(最多只允许输入30个字)