`

Java List Copy,Remove容易出现的问题

    博客分类:
  • JAVA
 
阅读更多

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

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



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()值等长(或更长)。
分享到:
评论

相关推荐

    java中List的用法和实例详解

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

    java开发集合例子

    List&lt;String&gt; copyList = new ArrayList(list); ``` 此外,我们还会学习如何处理并发,如使用`ConcurrentHashMap`在多线程环境下安全地操作`Map`,以及`CopyOnWriteArrayList`和`CopyOnWriteArraySet`在并发读写时...

    Java 1.8 API 帮助文档-中文版

    list.removeIf(e -&gt; e.isEmpty()); // 删除所有空元素 ``` 另一个重大改进是Stream API,它是处理集合数据的新方式。Stream API提供了大量用于操作数据的静态方法,如filter(), map(), reduce()等。通过链式调用...

    JAVA容器的作用和概览

    3. copy(List&lt;? super T&gt; dest, List&lt;? extends T&gt; src):将源列表的元素复制到目标列表。 Comparable接口: Comparable接口用于定义对象的自然排序,实现该接口的类的对象可以进行比较。通过实现compareTo(T other...

    Java集合详解代码.zip

    `sort()`方法可以对List进行排序,`reverse()`可以反向排列元素,`copy()`可以将一个集合的内容复制到另一个集合。 7. **数据结构理解**:了解这些集合背后的底层数据结构(如数组、链表、树等)对于优化代码性能至...

    几个java作业小题代码

    ### Java作业知识点解析 根据题目要求,我们对提供的四个Java代码片段进行详细的解析与知识点的归纳。 #### 一、检查列表是否存在重复元素 **代码片段分析:** ```java List&lt;String&gt; list = new ArrayList(); ...

    java基础之集合面试题共4页.pdf.zip

    9. **集合操作**:包括添加(add)、删除(remove)、查找(contains)、清空(clear)、复制(copy)、比较(equals)、迭代(iterator)等方法。 10. **集合效率**:理解不同集合的性能特征非常重要。例如,...

    Java中ArrayList类的用法.docx

    ArrayList类是Java.util包中的一个成员,继承自AbstractList并实现了List接口,因此它支持随机访问,但插入和删除操作可能比基于链表的List实现(如LinkedList)效率低。 1. **ArrayList的概念** ArrayList是一个...

    java的集合帮助文档

    Java集合框架是Java编程语言中的一个核心特性,它为存储、管理和操作对象提供了一组统一的接口和类。集合框架的使用极大地提高了代码的可读性、可维护性和效率。以下是对Java集合学习的一些关键知识点的详细解释: ...

    西安嘉辰Java面试宝典(2021).pdf

    面试中,Java开发者常常会面临各种技术问题,从基础知识到高级特性。以下是一些关键的Java面试知识点的详细解释: 1. **JDK与JRE的区别**:JDK(Java Development Kit)是Java开发工具包,包含了JRE(Java Runtime ...

    JAVA集合框架1[收集].pdf

    `copy(List dest, List src)`用于复制列表,`binarySearch(List l, Object o)`则在有序列表中执行二分查找。 示例代码展示了如何使用`Collections`对`List`进行操作。首先创建了一个`LinkedList`实例`l1`,然后向...

    Java_jihe2.rar_java集合

    Java集合框架是Java编程语言中不可或缺的一部分,它为开发者提供了数据结构和算法的实现,使得在处理各种数据存储和操作时更加高效。本资源“Java_jihe2.rar”包含了关于Java集合框架第二部分的学习源码,是进一步...

    java并发容器CopyOnWriteArrayList实现原理及源码分析

    在remove操作中,首先将原容器copy一份,然后在新副本上执行删除操作,最后将原容器引用指向新副本。 CopyOnWriteArrayList容器是一种高性能的并发容器,特别适用于读多写少的并发场景,但是需要注意其内存占用问题...

    Java集合部分面试题.docx

    理解这些基础知识点对于Java开发者来说至关重要,它们可以帮助你有效地选择和使用合适的集合类型,优化代码性能,并解决可能出现的问题。在面试中,对这些概念的深入理解和应用能力通常会被视为衡量候选人技能的重要...

    20个非常有用的Java功能代码

    在Java编程语言中,有众多实用的功能代码可以帮助开发者提高效率并简化日常工作。以下是一些从标题、描述和部分内容中提取的20个非常有用的Java功能代码的详细解释: 1. **字符串与整型间的转换**: - `String....

    Java容器类PPT学习教案.pptx

    例如,`Collections.sort()`方法可以对List进行排序,`Collections.copy()`用于将一个列表的内容复制到另一个列表。 以下是一个简单的`Collection`接口方法使用示例: ```java import java.util.*; public class ...

    Java集合案例及源代码.rar

    Java集合框架是Java编程语言中不可或缺的一部分,它提供了一组高效、灵活的数据结构,使得开发者可以方便地存储和管理各种类型的数据。这个压缩包“Java集合案例及源代码.rar”显然是一个教学资源,包含了丰富的实例...

    Java容器.xmind

    List 标记: interface ArrayList 标记: class CRUD : boolean add​(E e) boolean remove​(Object o) E set​(int index, E element) E get​(int index) 底层数组实现,查询快,增删慢 LinkedList 标记: ...

    JAVA面试使用的笔试题目

    这份Java面试笔试题目涵盖了多个Java基础、容器以及数据库相关的知识点,以下是这些知识点的详细解析: 1. **JDK和JRE的区别**: JDK(Java Development Kit)是Java开发工具包,包含了JRE(Java Runtime ...

Global site tag (gtag.js) - Google Analytics