Java集合在Java语言生态的重要地位不可忽视,接下来让我们一探究竟。

Java集合

1. 背景

  • 没有集合之前,Java已经可以存储对象,那就是数组 。数组既可以存基本数据类型,也可以存同一种引用数据类型。对数组查找是高效的,但是数组一旦定义长度就不可变,而且只能存放同一种类型。
  • 在程序设计的过程中,我们经常用到:队列、链接表、树和散列表等数据结构。没有集合前,如果我们需要用的,必须每次都自己定义非常麻烦,因此Java设计者就将这些数据结构封装起来提供给程序员使用。

2. Java集合的特点

  • 高性能。对于集合中的类,Java开发人员对其实现是高效的。一般很少人去改动这些已经很成熟其高效的API
  • 抽象性。集合类允许不同类型的集合以相同的方式和高度互操作方式工作;
  • 扩展性。集合类容易扩展和修改,程序员可以很容易地稍加改造就能满足自己的数据结构需求。

3. 集合的好处

  • 降低了开发难度。不必要再自己实现数据结构。
  • 提高了运行速度。集合类的内部实现是高效的
  • 高抽象性。借助泛型,只要了解了这些类的使用方法,就可以将它们应用到很多数据类型中。如果知道了LinkedList<String>的使用方法,也会知道LinkedList<Double>怎么用,则无需为每一种数据类型学习不同的API
  • 高重用性。借助泛型,就算对集合类中的元素类型进行了修改,集合类相关的代码也几乎不用修改。

4. Java集合框架

Java集合框架图

java-coll

  • Java集合框架包含两大类:集合(Collection)和图(Map)。
  • Collection存放一个元素集合;Map存放键值对映射

java-coll2

1. Collection接口:

  • 最基本的集合接口,存储一组不唯一,无序的对象。
  • Java不提供直接继承自Collection的类,只提供继承于的子接口(如List和set)。

2. List接口:

  • 有序、可重复Collection,可控制插入位置。
  • 可以通过下标访问

3. Set接口

  • 一组无序、不可重复元素

4. SortedSet接口

  • 继承Set,保存有序

5. Map接口

  • 存放一组键值对对象,提供key(键)到value(值)的映射。

6. Map.Entry

  • 描述在一个Map中的一个元素(键/值对)。是一个Map的内部类。

7. SortedMap

  • 继承自Map,使Key保存在升序

8. Enumeration

  • 可以枚举(一次获得一个)对象集合中的元素。
  • 被迭代器取代

注意:Set和List区别

Set List
无序、不可重复 有序、可重复
查找效率低;删除和插入效率高 查找效率高。插入删除效率低
插入删除不会引起元素位置改变 动态增长。插入删除会引起元素位置改变
HashSet TreeSet ArrayList LinkedList Vector

5. 集合使用

  • ArrayList的遍历
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package top.tobing.collection;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* ArrayList的使用
* @author Tobing
*/
public class Demo01CollArrayList {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("Hello");
list.add("World");
list.add("!");
// 遍历一:增强for变量
for(String s:list) {
System.out.print(s+" ");
}
System.out.println();
// 遍历二:转为数组
String[] strArr = new String[list.size()];
list.toArray(strArr);
for(int i=0;i<strArr.length;i++) {
System.out.print(strArr[i]+" ");
}
System.out.println();
// 遍历三:迭代器
Iterator<String> it = list.iterator();
while(it.hasNext()) {
System.out.print(it.next()+" ");
}
}
}
  • 结果
1
2
3
Hello World ! 
Hello World !
Hello World !
  • Map的遍历
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package top.tobing.collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
/**
* 变量Map
* @author Tobing
*/
public class Demo02CollMap {
public static void main(String[] args) {
Map<String,String> map = new HashMap<String,String>();
map.put("1","One");
map.put("2","Two");
map.put("3","Three");
map.put("4","Four");
// 遍历一:二次取值(常用)
for(String key:map.keySet()) {
System.out.print(key+":"+map.get(key)+"\t");
}
System.out.println();
// 遍历二:Map.entrySet使用迭代器
Iterator<Map.Entry<String, String>> it = map.entrySet().iterator();
while(it.hasNext()) {
Map.Entry<String, String> entry = it.next();
System.out.print(entry.getKey()+":"+entry.getValue()+"\t");
}
System.out.println();
// 遍历三:推荐,容量大的时候
for(Map.Entry<String, String> entry:map.entrySet()) {
System.out.print(entry.getKey()+":"+entry.getValue()+"\t");
}
}
}
  • 结果
1
2
3
1:One	2:Two	3:Three	4:Four	
1:One 2:Two 3:Three 4:Four
1:One 2:Two 3:Three 4:Four

评论