讲集合collection之前,我们先分清三个概念:
- colection 集合,用来表示任何一种数据结构
- Collection 集合接口,指的是 java.util.Collection接口,是 Set、List 和 Queue 接口的超类。
- Collections工具类指的是:java.util.Collections类
二、几个比较重要的接口和类简介
1、List接口
List 关心的是索引,与其他集合相比,List特有的就是和索引相关的一些方法:get(int index) 、 add(int index,Object o) 、 indexOf(Object o) 。
ArrayList 可以将它理解成一个可增长的数组,它提供快速迭代和快速随机访问的能力。
LinkedList 中的元素之间是双链接的,当需要快速插入和删除时LinkedList成为List中的不二选择。
Vector 是ArrayList的线程安全版本,性能比ArrayList要低,现在已经很少使用
2、Set接口
Set关心唯一性,它不允许重复。
HashSet 当不希望集合中有重复值,并且不关心元素之间的顺序时可以使用此类。
LinkedHashset 当不希望集合中有重复值,并且希望按照元素的插入顺序进行迭代遍历时可采用此类。
TreeSet 当不希望集合中有重复值,并且希望按照元素的自然顺序进行排序时可以采用此类。(自然顺序意思是某种和插入顺序无关,而是和元素本身的内容和特质有关的排序方式,譬如“abc”排在“abd”前面。)
3、Queue接口
Queue用于保存将要执行的任务列表。
LinkedList 同样实现了Queue接口,可以实现先进先出的队列。
PriorityQueue 用来创建自然排序的优先级队列。
4、Map接口
Map关心的是唯一的标识符。他将唯一的键映射到某个元素。当然键和值都是对象。
HashMap 当需要键值对表示,又不关心顺序时可采用HashMap。
Hashtable 注意Hashtable中的t是小写的,它是HashMap的线程安全版本,现在已经很少使用。
LinkedHashMap 当需要键值对,并且关心插入顺序时可采用它。
TreeMap 当需要键值对,并关心元素的自然排序时可采用它。
三、ArrayList的使用
ArrayList是一个可变长的数组实现,读取效率很高,是最常用的集合类型。
1、ArrayList的创建
在Java5版本之前我们使用:
1 | List list = new ArrayList(); |
在Java5版本之后,我们使用带泛型的写法:
1 | List<String> list = new ArrayList<String>(); |
上面的代码定义了一个只允许保存字符串的列表,尖括号括住的类型就是参数类型,也成泛型。带泛型的写法给了我们一个类型安全的集合。关于泛型的知识可以参见这里。
2、ArrayList的使用:
01 | List<String> list = new ArrayList<String>(); |
04 | list.add( "konikiwa!" ); |
07 | System.out.println(list.size()); |
08 | System.out.println(list.contains( 21 )); |
09 | System.out.println(list.remove( "hi!" )); |
10 | System.out.println(list.size()); |
关于List接口中的方法和ArrayList中的方法,大家可以看看JDK中的帮助。
3、基本数据类型的的自动装箱:
我们知道集合中存放的是对象,而不能是基本数据类型,在Java5之后可以使用自动装箱功能,更方便的导入基本数据类型。
1 | List<Integer> list = new ArrayList<Integer>(); |
2 | list.add( new Integer( 42 )); |
4、ArrayList的排序:
ArrayList本身不具备排序能力,但是我们可以使用Collections类的sort方法使其排序。我们看一个例子:
01 | import java.util.ArrayList; |
02 | import java.util.Collections; |
03 | import java.util.List; |
07 | public static void main(String[] args) { |
08 | List<String> list = new ArrayList<String>(); |
11 | list.add( "konikiwa!" ); |
15 | System.out.println( "排序前:" + list); |
17 | Collections.sort(list); |
19 | System.out.println( "排序后:" + list); |
编译并运行程序查看结果:
排序前:[nihao!, hi!, konikiwa!, hola, Bonjour]
排序后:[Bonjour, hi!, hola, konikiwa!, nihao!]
5、数组和List之间的转换
从数组转换成list,可以使用Arrays类的asList()方法:
01 | import java.util.ArrayList; |
02 | import java.util.Collections; |
03 | import java.util.List; |
07 | public static void main(String[] args) { |
09 | String[] sa = { "one" , "two" , "three" , "four" }; |
10 | List list = Arrays.asList(sa); |
11 | System.out.println( "list:" +list); |
12 | System.out.println( "list.size()=" +list.size()); |
6、Iterator和for-each
在for-each出现之前,我们想遍历ArrayList中的每个元素我们会使用Iterator接口:
01 | import java.util.Arrays; |
02 | import java.util.Iterator; |
03 | import java.util.List; |
07 | public static void main(String[] args) { |
10 | List<String> list = Arrays.asList( "one" , "two" , "three" , "four" ); |
13 | Iterator<String> it = list.iterator(); |
16 | while (it.hasNext()) { |
17 | System.out.println(it.next()); |
在for-each出现之后,遍历变得简单一些:
01 | import java.util.Arrays; |
02 | import java.util.Iterator; |
03 | import java.util.List; |
07 | public static void main(String[] args) { |
10 | List<String> list = Arrays.asList( "one" , "two" , "three" , "four" ); |
12 | for (String s : list) { |
13 | System.out.println(s); |