`
shuai1234
  • 浏览: 972594 次
  • 性别: Icon_minigender_1
  • 来自: 山西
社区版块
存档分类
最新评论

java list remove 等容易发生的问题

    博客分类:
  • java
 
阅读更多

主题:List删除元素,复制元素

平台:Window + Eclipse3.3 + JDK6


      懒程序员,在代码越写越多的情况下,总想着使用把代码精简一下,能不写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 是一个按照升序...

    Java集合Collection、List、Set、Map使用详解

    Collection接口定义了许多通用方法,如`add()`, `remove()`, `contains()`, `size()`等,这些方法在List和Set中都有所实现。 1.2.2 迭代器 迭代器(Iterator)是访问集合元素的主要方式,通过`iterator()`方法获取...

Global site tag (gtag.js) - Google Analytics