原文地址: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()值等长(或更长)
分享到:
相关推荐
在Java编程语言中,`List.removeAll()`方法是一个非常实用的函数,它允许我们从列表中一次性移除所有指定元素。这个方法是集合框架的一部分,它提供了高效的方式来进行元素的删除操作。本文将深入探讨`removeAll()`...
"javaList用法详解" Java 中的 List 用法是指在 Java 编程语言中使用 List 集合的方法和实现方式。List 集合是 Java 中的一种常用的集合类型,提供了许多实用的方法和实现类,下面将详细介绍 List 用法和实例。 ...
在Java编程中,`List`过滤是一个常见的任务,它涉及到集合操作和条件判断。当我们需要从一个`List`中筛选出满足特定条件的元素时,Java提供了多种方式来实现这一功能。这篇博客“java list 过滤”可能深入探讨了这些...
根据提供的文件信息,标题与描述均指向了Java中List的操作方法。然而,给出的部分内容却是一段关于导入Excel文件到Web应用中的代码片段,并没有直接涉及List的具体操作方法。因此,我们将结合标题与描述,围绕Java中...
### Java 计算同一 List 中是否有相同值 在 Java 编程中,判断一个 `List` 中是否存在重复元素是一项常见的需求。特别是在数据处理、验证或分析等场景中,确保数据的唯一性对于维持数据完整性至关重要。 #### 核心...
JAVA中的LIST接口提供了多个重载的REMOVE方法,分别传入参数为索引index、Object、Integer等,这些重载方法的调用原理是什么?在实际开发中,我们经常会遇到这种情况,例如在移除集合元素时,究竟是调用哪个REMOVE...
在Java编程语言中,`List`接口是集合框架的一个重要组成部分,它代表了一种有序的、可变大小的集合。`List`接口继承自`Collection`接口,它提供了额外的功能,比如按照索引访问元素、保持元素的顺序以及允许重复元素...
1. **日志添加**:当发生某个操作(如注册、登录、登出)时,我们可以创建一个日志对象(如Log类),包含时间、操作类型和详细信息等字段,然后使用`list.add(log)`将其添加到列表。 2. **日志删除**:根据特定条件...
- `List`接口中的方法`add`, `remove`, `set`等操作可能会影响迭代器,因此在遍历列表时应避免修改列表,除非使用`Iterator`的`remove()`方法。 - `List`接口还提供了一些其他的方法,如`contains()`, `indexOf()`, ...
在Java编程语言中,`List`接口是集合框架的一个重要组成部分,它提供了顺序存储和访问元素的能力。`remove()`方法是`List`接口中的一个关键操作,用于从列表中删除指定的元素或根据索引移除元素。在使用`remove()`...
"javalist.zip_list集合 java"这个标题暗示我们将探讨Java中的List集合以及它的应用。描述中提到“java中集合list的应用非常重要”,这确实不假,因为List在处理有序数据时具有广泛的应用场景。 List接口位于java....
在Java编程语言中,List接口是集合框架的重要组成部分,它代表了一个有序的元素序列,允许重复元素,并且保持插入顺序。对于初学者来说,理解如何在List中进行增删改查操作是掌握Java集合框架的基础。本文将详细介绍...
这个项目包含添加联系人、搜索联系人、删除联系人以及查询联系人等核心功能,是学习Java集合框架(特别是List接口)及其相关API的好例子。下面我们将深入探讨相关的Java知识点。 1. **Java集合框架**:Java集合框架...
如果在遍历过程中需要移除元素,必须使用`it.remove()`,直接调用`list.remove()`会导致并发修改异常(ConcurrentModificationException)。 ### 第二种:增强型for循环(foreach) ```java for (A a : list) { /...
Java List 是一种集合框架中的接口,它代表了一个有序的、可重复的元素序列。与数组类似,List 可以通过角标访问元素,但不同的是,List 的大小是可变的,可以在运行时动态地添加或删除元素。下面我们将详细讨论 ...
在Java编程语言中,List接口是集合框架的重要组成部分,它属于Collection接口的子接口。List接口主要用于存储有序的、可重复的元素序列。与Set不同,List允许元素重复,并且保持插入时的顺序。本篇将详细介绍Java中...
【Java基础——List接口详解(ArrayList、LinkedList、匿名类)】 在Java编程中,List接口是集合框架的重要组成部分,提供了有序存储元素的功能。ArrayList和LinkedList是List接口的两种主要实现,它们各有优缺点,...
Collection 是集合框架中的根接口,提供了基本的集合操作,如 add、remove、contains 等。Collection 接口没有实现类,因此需要通过其子接口来实现。 Set 是一个不能包含重复元素的集合,SortedSet 是一个按照升序...