`
小皮球
  • 浏览: 33944 次
  • 性别: Icon_minigender_1
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

java list remove 等容易发生的问题

阅读更多
原文地址:http://linuxlong.iteye.com/blog/651469

首先,提醒下:
Arrays.asList 转化为的list。它和new ArrayList出来的对象不一样
例如在: list.remove时候,数组转化来的容易出错,new  ArrayList() 更安全点!.

其他:

      懒程序员,在代码越写越多的情况下,总想着使用把代码精简一下,能不写if else的,能不写for循环的尽量不想写,但是遇到的问题都要解决的呀,因此调用同逻辑的已存在方法便是首选。


  今天就集合类(List)两个容易出错的方法做个记录,可以引以为戒,并且也提供正常的使用方式, 都是在java.utils包,方便使用。



Java代码

   1. package com.longer.list; 
   2.  
   3. import java.util.ArrayList; 
   4. import java.util.Arrays; 
   5. import java.util.Collections; 
   6. import java.util.Iterator; 
   7. import java.util.List; 
   8.  
   9. import junit.framework.TestCase; 
  10.  
  11. /**
  12.  * 
  13.  * @author Longer
  14.  * Apr 23, 2010 2:49:13 PM
  15.  */ 
  16. public class ListTest extends TestCase { 
  17.  
  18.     class TempBean{ 
  19.          
  20.         public TempBean( String str ){ 
  21.             this.str = str; 
  22.         } 
  23.          
  24.         String str; 
  25.  
  26.         public String getStr() { 
  27.             return str; 
  28.         } 
  29.  
  30.         public void setStr(String str) { 
  31.             this.str = str; 
  32.         } 
  33.     } 
  34.      
  35.     List<TempBean> tempList = null; 
  36.     protected void setUp() throws Exception { 
  37.         super.setUp(); 
  38.          
  39.         tempList = new ArrayList<TempBean>(); 
  40.         tempList.add( new TempBean("1") ); 
  41.         tempList.add( new TempBean("2") ); 
  42.         tempList.add( new TempBean("30") ); 
  43.         tempList.add( new TempBean("31") ); 
  44.         tempList.add( new TempBean("3") ); 
  45.     } 
  46.  
  47.     protected void tearDown() throws Exception { 
  48.         super.tearDown(); 
  49.          
  50.         tempList.clear(); 
  51.         tempList = null; 
  52.     } 
  53.      
  54.     public void testRemove1(){ 
  55.          
  56.         for (TempBean bean : tempList ) { 
  57.             //exception:java.util.ConcurrentModificationException 
  58.             //tempList.remove( bean ); 
  59.         } 
  60.         System.out.println( tempList ); 
  61.     } 
  62.      
  63.     public void testRemove2(){ 
  64.          
  65.         for (int i = 0; i < tempList.size(); i++) { 
  66.             TempBean bean = tempList.get(i); 
  67.             tempList.remove( i );//or tempList.remove(bean); 
  68.             i--; 
  69.         } 
  70.         System.out.println( tempList ); 
  71.     } 
  72.      
  73.     public void testRemove3(){ 
  74.          
  75.         System.out.println("before remove:" + tempList ); 
  76.         for (Iterator iterator = this.tempList.iterator(); iterator.hasNext();) { 
  77.             iterator.remove(); 
  78.             //exception:java.lang.IllegalStateException 
  79.             //tempList.add( new TempBean("") ); 
  80.         } 
  81.         System.out.println("after remove:"+ tempList ); 
  82.     } 
  83.      
  84.     public void testCopy1(){ 
  85.          
  86.         List<TempBean> newList = new ArrayList<TempBean>(); 
  87.         //exception:java.lang.IndexOutOfBoundsException: Source does not fit in dest 
  88.         //Collections.copy( newList, tempList ); 
  89.     } 
  90.      
  91.     public void testCopy2(){ 
  92.          
  93.         List<TempBean> newList = new ArrayList<TempBean>(Arrays.asList(new TempBean[ this.tempList.size()])); 
  94.         Collections.copy( newList, tempList ); 
  95.         System.out.println( newList ); 
  96.     } 
  97. } 

package com.longer.list;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;

import junit.framework.TestCase;

/**
*
* @author Longer
* Apr 23, 2010 2:49:13 PM
*/
public class ListTest extends TestCase {

class TempBean{

public TempBean( String str ){
this.str = str;
}

String str;

public String getStr() {
return str;
}

public void setStr(String str) {
this.str = str;
}
}

List<TempBean> tempList = null;
protected void setUp() throws Exception {
super.setUp();

tempList = new ArrayList<TempBean>();
tempList.add( new TempBean("1") );
tempList.add( new TempBean("2") );
tempList.add( new TempBean("30") );
tempList.add( new TempBean("31") );
tempList.add( new TempBean("3") );
}

protected void tearDown() throws Exception {
super.tearDown();

tempList.clear();
tempList = null;
}

public void testRemove1(){

for (TempBean bean : tempList ) {
//exception:java.util.ConcurrentModificationException
//tempList.remove( bean );
}
System.out.println( tempList );
}

public void testRemove2(){

for (int i = 0; i < tempList.size(); i++) {
TempBean bean = tempList.get(i);
tempList.remove( i );//or tempList.remove(bean);
i--;
}
System.out.println( tempList );
}

public void testRemove3(){

System.out.println("before remove:" + tempList );
for (Iterator iterator = this.tempList.iterator(); iterator.hasNext();) {
iterator.remove();
//exception:java.lang.IllegalStateException
//tempList.add( new TempBean("") );
}
System.out.println("after remove:"+ tempList );
}

public void testCopy1(){

List<TempBean> newList = new ArrayList<TempBean>();
//exception:java.lang.IndexOutOfBoundsException: Source does not fit in dest
//Collections.copy( newList, tempList );
}

public void testCopy2(){

List<TempBean> newList = new ArrayList<TempBean>(Arrays.asList(new TempBean[ this.tempList.size()]));
Collections.copy( newList, tempList );
System.out.println( newList );
}
}






  异常解释:


  1:testRemove1-->java.util.ConcurrentModificationException

  此类的JavaDOC部分原文:

    This exception may be thrown by methods that have detected concurrent modification of an object when such modification is not permissible。

  简单翻译:

      检测到一个对象存在同步修改,并且此修改不被允许的情况下,此异常将被方法抛出。



  因此, 可以看出List是不支持同步修改的,其实整个Collection、Map都与List一样的情况,详细的原因得从迭代器Iterator去研究,这里不做分析。大概理解是Iterator在遍历的时间内,其源对象索引发生了改变,导致了不同步现象。


  2)testRemove3-->java.lang.IllegalStateException

  此类的JavaDOC部分原文:

    Signals that a method has been invoked at an illegal or inappropriate time

  简单翻译:

    信息灯,一个方法在非法或者不恰当的时间内被调用。

  因此, 问题的根源同上。


  3)testCopy1-->java.lang.IndexOutOfBoundsException

  Collections.copy JavaDOC部分原文:

    ......The destination list must be at least as long as the source list.......

  简单翻译:

    目的list必须至少要与源list等长。(目的List可以比源List长度长)



  因此, 它这里指的长度是List里的size()方法值,我们都知道new ArrayList()初始化的时候size()等于0,即便是你使用new ArrayList(10)来初始化,也只是预设了一个initialCapacity==10的存储空间,size()还是等于0。因此在使用 Collections.copy之前,需要把目的List加一些空的元素,直到目的List的size()值与源List的size()值等长(或更长)
分享到:
评论

相关推荐

    List.removeAll() 方法的性能效率

    在Java编程语言中,`List.removeAll()`方法是一个非常实用的函数,它允许我们从列表中一次性移除所有指定元素。这个方法是集合框架的一部分,它提供了高效的方式来进行元素的删除操作。本文将深入探讨`removeAll()`...

    javaList用法

    "javaList用法详解" Java 中的 List 用法是指在 Java 编程语言中使用 List 集合的方法和实现方式。List 集合是 Java 中的一种常用的集合类型,提供了许多实用的方法和实现类,下面将详细介绍 List 用法和实例。 ...

    java list 过滤

    在Java编程中,`List`过滤是一个常见的任务,它涉及到集合操作和条件判断。当我们需要从一个`List`中筛选出满足特定条件的元素时,Java提供了多种方式来实现这一功能。这篇博客“java list 过滤”可能深入探讨了这些...

    java的list取之方法

    根据提供的文件信息,标题与描述均指向了Java中List的操作方法。然而,给出的部分内容却是一段关于导入Excel文件到Web应用中的代码片段,并没有直接涉及List的具体操作方法。因此,我们将结合标题与描述,围绕Java中...

    java计算同一个list中是否有相同的值

    ### Java 计算同一 List 中是否有相同值 在 Java 编程中,判断一个 `List` 中是否存在重复元素是一项常见的需求。特别是在数据处理、验证或分析等场景中,确保数据的唯一性对于维持数据完整性至关重要。 #### 核心...

    JAVA的LIST接口的REMOVE重载方法调用原理解析

    JAVA中的LIST接口提供了多个重载的REMOVE方法,分别传入参数为索引index、Object、Integer等,这些重载方法的调用原理是什么?在实际开发中,我们经常会遇到这种情况,例如在移除集合元素时,究竟是调用哪个REMOVE...

    JavaList.rar_javalist

    在Java编程语言中,`List`接口是集合框架的一个重要组成部分,它代表了一种有序的、可变大小的集合。`List`接口继承自`Collection`接口,它提供了额外的功能,比如按照索引访问元素、保持元素的顺序以及允许重复元素...

    Java List集合的应用.rar

    1. **日志添加**:当发生某个操作(如注册、登录、登出)时,我们可以创建一个日志对象(如Log类),包含时间、操作类型和详细信息等字段,然后使用`list.add(log)`将其添加到列表。 2. **日志删除**:根据特定条件...

    javaList的定义和方法

    - `List`接口中的方法`add`, `remove`, `set`等操作可能会影响迭代器,因此在遍历列表时应避免修改列表,除非使用`Iterator`的`remove()`方法。 - `List`接口还提供了一些其他的方法,如`contains()`, `indexOf()`, ...

    Java list.remove( )方法注意事项

    在Java编程语言中,`List`接口是集合框架的一个重要组成部分,它提供了顺序存储和访问元素的能力。`remove()`方法是`List`接口中的一个关键操作,用于从列表中删除指定的元素或根据索引移除元素。在使用`remove()`...

    javalist.zip_list集合 java

    "javalist.zip_list集合 java"这个标题暗示我们将探讨Java中的List集合以及它的应用。描述中提到“java中集合list的应用非常重要”,这确实不假,因为List在处理有序数据时具有广泛的应用场景。 List接口位于java....

    JAVA中List的增删改查

    在Java编程语言中,List接口是集合框架的重要组成部分,它代表了一个有序的元素序列,允许重复元素,并且保持插入顺序。对于初学者来说,理解如何在List中进行增删改查操作是掌握Java集合框架的基础。本文将详细介绍...

    Java-Mail-list.zip_JAVA list通讯录

    这个项目包含添加联系人、搜索联系人、删除联系人以及查询联系人等核心功能,是学习Java集合框架(特别是List接口)及其相关API的好例子。下面我们将深入探讨相关的Java知识点。 1. **Java集合框架**:Java集合框架...

    java中List对象集合的遍历方法(三个)

    如果在遍历过程中需要移除元素,必须使用`it.remove()`,直接调用`list.remove()`会导致并发修改异常(ConcurrentModificationException)。 ### 第二种:增强型for循环(foreach) ```java for (A a : list) { /...

    Java List简介_动力节点Java学院整理

    Java List 是一种集合框架中的接口,它代表了一个有序的、可重复的元素序列。与数组类似,List 可以通过角标访问元素,但不同的是,List 的大小是可变的,可以在运行时动态地添加或删除元素。下面我们将详细讨论 ...

    java中List的用法和实例详解

    在Java编程语言中,List接口是集合框架的重要组成部分,它属于Collection接口的子接口。List接口主要用于存储有序的、可重复的元素序列。与Set不同,List允许元素重复,并且保持插入时的顺序。本篇将详细介绍Java中...

    java基础--list(ArrayList、LinkedList、匿名类).docx

    【Java基础——List接口详解(ArrayList、LinkedList、匿名类)】 在Java编程中,List接口是集合框架的重要组成部分,提供了有序存储元素的功能。ArrayList和LinkedList是List接口的两种主要实现,它们各有优缺点,...

    java集合类详解(set list ArrayList等java集合类详述)

    Collection 是集合框架中的根接口,提供了基本的集合操作,如 add、remove、contains 等。Collection 接口没有实现类,因此需要通过其子接口来实现。 Set 是一个不能包含重复元素的集合,SortedSet 是一个按照升序...

Global site tag (gtag.js) - Google Analytics