Java集合类是一种特别有用的工具类,可以用于存储数量不等的多个对象,并可以实现常用的数据结构,如栈、队列等。除此之外,Java集合还可以用于保存具有映射关系的关联数组。Java集合分为:Set、List和Map三种体系,其中Set代表无序、不可重复的集合;List代表有序、可重复的集合;Map则代表具有映射关系的集合。
集合概述
在编程时,常常需要集中存放多个数据,起初我们使用数组来保存多个对象,但数组长度不可变化,一旦在初始化数组时指定了长度,那么这个数组长度就是不可变的。另外如果我们要保存具有映射关系的的数据,例如:成绩表:语文—79,数学—80,数组就有点不能胜任。
为了保存数量不确定的数据,以及保存具有映射关系的数据。Java提供了集合类。集合类主要负责保存、盛装其他数据,因此集合类也被称为容器类。所有的集合类都位于java.util包下。
集合类与数组不一样,数组元素可以是基本类型的数据,也可以是对象,而集合里只能保存对象。
Java的集合类主要由两个接口派生而来:Collection和Map。Collection和Map是Java集合框架的根接口,这两个接口有包含了一些子接口或实现类。
上图显示了Collection体系里的集合,其中Set和List接口都是Collection接口派生出的两个子接口,他们分别代表了无序集合和有序集合;Queue是Java提供的队列实现。
上图为Map体系结构示意图,所有的Map实现类用于保存具有映射关系的数据。Map保存的每项数据都是key-value两个值组成。Map中的key值是不可重复的,key用于标识集合里的每项数据。
对于Java的所有集合分类,可以分为三大类,
1、set集合:类似于一个罐子,将对象存放在Set集合时,Set集合无法记住这个元素的顺序,所以Set里的元素不能重复。
2、List集合:非常类似于数组,它可以记住每次添加的元素的顺序,不同于数组的是List的长度是可变的。
3、Map集合:类似于中药橱柜,每个橱柜上的抽屉都带有标签,标签相当于key,抽屉相当于对象。可以根据key来找到对象。
对于Set、List、Queue和Map四种集合,最常用的类为:HashSet、TreeSet、ArrayList、ArrayDeque、LinkedList、HashMap、TreeMap。Collection
Collection接口是List、Set、Queue接口的父接口,该接口里定义的方法可用于操作Set集合、List集合、Queue集合。
- Iterator
Iterator接口也是Java集合框架的成员,但它与Collection、Map集合不一样。Collection、Map集合主要用来盛装对象,而Iterator则主要用来遍历(迭代访问)Collection集合中的元素,Iterator对象也被称为迭代器。
举例:
public static void test(){
Collection<String> collection = new ArrayList<String>();
collection.add("testAdd");
collection.add("test1Add");
collection.add("test2Add");
collection.add("test3Add");
Collection<String> collection1 = new ArrayList<String>();
collection1.add("addAll");
collection1.addAll(collection);
Iterator<String> iterator = collection1.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
System.out.println(collection.contains("test"));
System.out.println(collection.contains("testAdd"));
System.out.println(collection1.containsAll(collection));
collection1.clear();
}
当使用Iterator迭代访问Collection集合元素时,Collection集合里的元素不能被改变,只能通过Iterator的remove方法删除上一次next方法返回的集合元素才可以,否则将会引发并发修改异常:java.util.ConcurrentModificationException。
这一点类似于windows系统中,当我们打开一个文件时,又对这个文件执行了删除操作。Windows总会提示我们文件正在被使用,不能删除一个道理。
4. 使用foreach循环遍历集合元素
除了使用Iterator接口迭代访问Collection集合里的元素之外,还可以使用foreach循环迭代访问集合元素更加便捷。
System.out.println("****************************************");
Object o[] = users1.toArray();
for(Object o1:o){
System.out.println(o1);
}
System.out.println("****************************************");
注意:使用foreach循环来遍历Collection集合时,与Iterator接口一样,迭代对象并不是元素对象本身,而是系统依次把集合元素对象的值赋给了迭代变量而已。
源代码:
https://github.com/wolf521/demo/tree/master/src/main/java/com/example/demo/collection