Java Collections框架主要提供了List(列表)、Queue(队列)、Set(集合)、Stack(栈)和Map(映射表,用于存放键值对)等数据结构。其中,List、Queue、Set、Stack都继承自Collection接口。
Collection是整个集合框架的基础,它里面存储一组对象,表示不同类型的Collections,它的作用只是提供维护一组对象的基本接口而已。
下面分别介绍Set、List、Map 3个接口。
- Set 表示数学意义上的集合概念。其最主要的特点是集合中的元素不能重复,因此存入Set的每个元素都必须要定义equals()方法来确保对象的唯一性。该接口有两个实现类:HashSet和TreeSet。其中TreeSet实现了SortedSet接口,因此TreeSet容器中的元素是有序的。
- List 又称为有序的Collection。它按对象进入的顺序保存对象,所以它能对列表中的每个元素的插入和删除位置进行精准的控制。同时,它可以保存重复的对象。LinkedList、ArrayList和Vector都实现了List接口。
- Map 提供了一个从键映射到值得数据结构。它用于保存键值对,其中值可以重复,当键是唯一的,不能重复。Java类库中有很多个实现该接口的类:HashMap、TreeMap、LinkedHashMap、WeakHashMap和IdentityHashMap。虽然它们都实现了相同的接口,当执行效率却不是相同的。具体而言,HashMap是基于散列表实现的,采用对象的HashCode进行快速查询。LinkedHashMap采用列表来维护内部的顺序。TreeMap基于红黑树的数据结构来实现的,内部元素是按需排序的。
引申:Collection和Collections有什么区别?
1、java.util.Collection 是一个集合接口。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式。
2、java.util.Collections 是一个包装类。它包含有各种有关集合操作的静态多态方法。此类不能实例化,就像一个工具类,服务于Java的Collection框架。若在使用Collections来的方法时,对应的collection的对象为null,则这些方法就会抛出NullPointerException
使用Collections的示例代码:
import java.util.*;
public class CollectionsDemo {
public static void main(String[] args) {
List<Integer> list=new LinkedList<Integer>();
int array[]={1,5,8,14};
for (int i=0;i<array.length;i++){
list.add(new Integer(array[i]));
}
Collections.sort(list);
//list.sort(Comparator.comparing(Integer::intValue));
//list.sort(Comparator.comparing(Integer::intValue).reversed());
System.out.println(list.toString());
}
}
什么是迭代器
迭代器(Iterator)是一个对象,它的工作是遍历并选择序列中的对象,它提供了一种访问一个容器(container)对象中的各个元素,而不必暴露该对象内部细节的方法。通过迭代器,开发人员不需要了解容器底层的结构,就可以实现对容器的遍历。由于创建迭代器的代价小,因此迭代器通常被成为轻量级的容器。
迭代器的使用主要有以下3个方面的注意事项:
- 使用容器的iterator()方法返回一个Iterator,然后通过Iterator的next()方法返回第一个元素。
- 使用Iterator的hasNext()方法判断容器中是否还有元素,如果由,可以使用next()方法获取下一个元素。
- 可以通过remove()方法删除迭代器返回的元素。
Iterator支持派生的兄弟成员。ListIterator只存在于List中,支持在迭代期间向List中添加或删除元素,并且可以在List中双向滚动。
Iterator的使用方法如下列代码:
import java.util.*;
public class IteratorDemo {
public static void main(String[] args) {
List<String> list=new LinkedList<String>();
list.add("first");
list.add("second");
list.add("third");
list.add("fourth");
for (Iterator<String> iterator=list.iterator();iterator.hasNext();){
String string= iterator.next();
System.out.println(string);
}
/*for (String str:list){
System.out.println(str);
}*/
}
}
运行结果为:
first
second
third
fourth
在使用iterator()方法时经常会遇到ConcurrentModificationException(并发修改异常)异常,这通常是由于在使用Iterator遍历容器的同时又对容器做增加或删除操作所导致的,或者由于多线程操作导致的,当一个线程使用迭代器遍历容器的同时,另外一个线程对这个容器进行增加或删除操作。
引申:Iterator和ListIterator有什么区别?
Iterator只能正向遍历1集合,适用于获取移除元素。ListIterator继承自Iterator,专门针对List,可以从两个方向来遍历List,同时支持元素的修改。