package com.study.java.connections;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
/**
*
* @author Administrator
* List 接口方法测试
*/
public class ListTest {
/**
* 集合List接口基本用法
* @param a
* @param c
*/
public static void basicTest(List<String> a,Collection c){
a.add("A");
//指定位置添加元素
a.add(1, "B");
List<String> list1 = new ArrayList<String>(c);
//指定位置添加集合
a.addAll(2, list1);
//打印指定位置元素,通过索引取得元素
System.out.println(a.get(1));
//集合是否包含该元素
System.out.println("是否包含元素 "+a.contains("A"));
//返回元素第一次出现位置索引
System.out.println("第一次出现位置索引 "+a.indexOf("B"));
//返回元素最后一次出现位置索引
System.out.println("最后一次出现位置索引 "+a.lastIndexOf("B"));
//将指定位置元素替换
a.set(2, "C");
System.out.println("集合大小 "+a.size());
//截取指定位置集合
List<String> list2 = a.subList(0, 2);
System.out.println("截取集合 "+list2);
//返回集合大小
System.out.println("集合大小 "+a.size());
//集合转换数组
System.out.println("转换数组 "+a.toArray());
//仅保留指定集合中的元素
List<String> list3 = new ArrayList<String>();
list3.add("N");
list3.add("B");
a.retainAll(list2);/**
*报java.util.ConcurrentModificationException
* Collection / Map 对象实际只有一个元素的时候,
* ConcurrentModificationException 异常并不会被抛出
*/
a.removeAll(list3);
a.add("D");
a.add("F");
//移除指定元素
a.remove("D");
//移除指定位置的元素
a.remove(1);
}
/**
* 迭代集合元素两种不同方式
* @param list
*/
public static void printlist(List<String> list){
if(list != null && !list.isEmpty()){
//利用iterator()方法迭代集合
Iterator<String> it = list.iterator();
while(it.hasNext()){
System.out.println("itreator 迭代方式"+it.next());
}
//利用ListItreator接口迭代
ListIterator listit = list.listIterator();
while(listit.hasNext()){
System.out.println("Listiterator 迭代方式"+listit.next());
}
}
}
/**
* 测试ListIterator接口迭代集合方式
*/
public static void testListIterator(List<String> list){
ListIterator listit = list.listIterator();
//逆向遍历列表
while(listit.hasPrevious()){
System.out.println(listit.previous());
}
}
public static void main(String args[]){
List<String> colle1 = new ArrayList<String>();
colle1.add("G");
colle1.add("N");
colle1.add("GH");
List<String> colle2 = new ArrayList<String>();
colle2.add("N");
colle2.add("C");
//boolean flag = colle1.retainAll(colle2);
//System.out.println(flag+" "+colle1 +" " +colle1.size());
List<String> list2 = colle1.subList(0, 1);
boolean flag2 = colle1.retainAll(list2);//当元素只有一个时不会抛异常
System.out.println(flag2+" "+colle1 );
//basicTest(colle1,colle2);
}
}
运行程序时报了异常java.util.ConcurrentModificationException 这个异常大概的原因就是说非线程安全的集合在对集合进行删除的时候报的异常,网上的解释有很多。
sublist 方法源码:
public List<E> subList(int fromIndex, int toIndex) {
return (this instanceof RandomAccess ?
new RandomAccessSubList<E>(this, fromIndex, toIndex) :
new SubList<E>(this, fromIndex, toIndex));
}
通过查看SubList类所抛出的异常并没有该异常,通过Debug调式得知该异常是由于每次在对集合进行修改的时候都会调用一个叫checkForComodification 方法抛出的异常,该方法主要是检测集合大小是否一致。
在AbstractCollection 的 retainAll 方法的源码:
public boolean retainAll(Collection<?> c) {
boolean modified = false;
Iterator<E> e = iterator();
while (e.hasNext()) {
if (!c.contains(e.next())) {
e.remove();
modified = true;
}
}
return modified;
}
retainAll 方法 是通过Iterator来移除操作不包含的元素,Iterator实现锁机制不存在不安全操作,然而引起该异常的真正原因是由于其作用是返回一个以fromIndex为起始索引(包含),以toIndex为终止索引(不包含)的子列表(List)
但值得注意的是,返回的这个子列表的幕后其实还是原列表;也就是说,修改这个子列表,将导致原列表也发生改变;反之亦然。也就是该原因导致该异常的出现
分享到:
相关推荐
总结起来,Java集合类的学习不仅仅是了解每个类的基本用法,更关键的是理解它们背后的实现原理和数据结构,以便根据实际需求选择最合适的集合类。通过深入学习和实践,我们可以提高代码的效率和可维护性,更好地应对...
在深入学习Java集合时,我们需要特别关注HashMap和HashTable这两个重要的类。虽然它们都是用于存储键值对的数据结构,但它们在设计和使用上有显著的区别。 HashMap是Java 1.2引入的,它是Map接口的一个实现,提供了...
这个压缩包文件“Collection”很可能包含了关于Java集合类的一些示例代码,这些代码可以用于理解和学习如何在实际项目中应用这些集合。 Java集合框架主要由两个接口层次构成:Collection和Map。Collection是所有单...
ArrayList是Java集合框架中的一种线性数据结构,属于List接口的实现类。它的底层实现是一个动态增长的数组,因此在ArrayList中,元素的位置是有序的。ArrayList的主要优点是随机访问快速,因为通过索引可以直接获取...
Java集合类是Java编程语言中一个非常重要的概念,它提供了数据结构和算法的实现,使得开发者可以方便地存储、管理和操作对象。Java集合框架包括多种接口(如List、Set、Queue)和实现这些接口的类(如ArrayList、...
JAVA基础集合类学习.md
学习Java集合需要掌握以下几个方面: 1. 怎样得到(选择)集合对象 2. 怎样添加元素 3. 怎样删除元素 4. 怎样循环遍历每一个元素 在实际开发中,Java集合是非常重要的,掌握Java集合的使用可以提高开发效率和代码...
本篇将详细探讨Java集合框架的基础知识,包括核心接口、类的层级结构以及Java 5引入的泛型特性。 首先,让我们了解一下`java.lang.Class`。`Class`类在Java中扮演着特殊的角色,它不仅是一个普通类,而且是用于获取...
通过这样的学习方式,不仅可以加深对Java集合的理解,还能提高问题解决的能力。 总结来说,Java集合框架提供了丰富的数据结构和算法,适应各种场景下的数据存储需求。理解并熟练掌握这些集合类的特性和使用方法,...
Java集合类是Java编程语言中一个非常重要的概念,它们提供了数据结构和算法的实现,使得开发者能够更加高效地管理和操作数据。在Java中,集合类主要用于存储和操作对象,弥补了数组的一些不足,如动态扩展、灵活性...
本资料包含“集合类.doc”和“java_集合.pdf”,旨在深入探讨Java集合类的相关知识。 首先,Java集合框架的核心接口包括List、Set、Queue和Map。这些接口定义了各种集合的行为,而具体的实现类则提供了实际的数据...
在`Java集合排序及java集合类详解.PDF`文档中,你可以找到关于集合排序和不同集合类的详细讲解。例如,如何使用Collections.sort()方法对List进行排序,以及如何自定义比较器Comparator实现复杂排序逻辑。对于Map,...
以下是关于Java集合类,特别是HashMap、CurrentHashMap、ArrayList和LinkedList的详细知识点: 1. **HashMap**: HashMap是Java中最基本的键值对存储结构,基于哈希表实现。它提供了快速的插入、删除和查找操作,...
Java集合类API是Java编程语言中的核心组件,提供了多种数据结构,如列表(List)、队列(Queue)、集(Set)和映射(Map),用于存储和操作对象。...因此,不断学习和掌握最新的Java集合类API是非常必要的。
在这个“java集合类.rar”压缩包中,可能包含了关于Java集合框架的各种资料,包括ArrayList、LinkedList、HashMap、HashSet等核心容器的详细讲解。 ArrayList是基于动态数组实现的集合,提供了按索引访问元素的能力...
Java集合类面试题总结 Java集合类是Java编程语言中的一部分,用于存储和操作大量数据。Java集合类的使用非常广泛,特别是在...通过学习Collection、List和Set接口的使用,我们可以更好地理解Java集合类的原理和应用。
在这个Java集合类的学习资料中,我们将深入探讨`Collection`以及与其相关的`TreeMap`、`Set`和`List`等概念。 首先,我们从`Collection`接口开始。`Collection`接口是`java.util`包下的核心接口,它定义了集合的...
xmind格式的Java集合框架学习导图,包括Collection接口/Map接口以及具体实现类。 同样包含大厂面试题,也在导图中有所体现。 能学到什么: 更加成体系的知识框架,更加全面的、系统的知识。 思维导图: 思维导图具有...