一、概述
容器是Java的重要组成部分,在实际应用中选择适当的容器,往往能达到事半功倍的效果。
下图为Java集合框架图,图源于菜鸟教程:
Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是哈希表(Map),存储键/值对映射。Collection 接口又有 3 种子类型,List、Set 和 Queue,再下面是一些抽象类,最后是具体实现类,常用的有 ArrayList、LinkedList、HashSet、LinkedHashSet、HashMap、LinkedHashMap 等等。
从上图中也可以看到,Java的类基本上都继承自Collection和Map。我们平时使用的主要是一些具体实现类,例如ArrayList,LinkedList,HashSet,HashMap等。本文将对这些容器的基础操作进行汇总,以便复习与查阅。
NOTE: 初始化容器时需要注意抽象类(或接口)和具体实现类的区别。抽象类只关心抽象方法的定义,不关心具体如何实现。抽象类不可以实例化对象,也就是说new后面不能接抽象类,而要接具体实现类。否则会引发错误XXX is abstract; cannot be instantiated
。
二、各类容器
2.1 List
List是一种接口。使用前需要导入java.util.List相关包。
具体实现类有:
- ArrayList
- LinkedList
- Vector
- Stack:Vector的子类
ArrayList和LinkedList常放在一起比较,两者都是线程不安全的。ArrayList的底层是Object数组,LInkedList的底层结构是双向链表。所以两者本质的区别类似于数组与链表的区别(读取、删除等操作有不同)。
Vector的底层同样是Object数组,是线程安全的,但当前大部分情况都使用ArrayList。
初始化方法
//List 的ArrayList 实现
List<String> list1 = new ArrayList<>();
// List 的LinkedList 实现
List<String> list2 = new LinkedList<>();
// Stack对象创建
Stack<Integer> stk = new Stack<>();
NOTE:尖括号里不能用基础数据类型,需要包装。
使用方法
- ArrayList
// 添加元素
list.add(obj);
list.addAll();
// boolean addAll(Collection c);
// 访问元素,按索引
obj = list.get(index);
// 删除元素,按索引
list.remove(index)</