目录
Java集合框架是Java编程语言提供的一组接口,用于处理对象集合。Java集合框架中包括了一系列的接口、实现类和算法,可以方便地操作和管理各种类型的集合数据。
Java集合框架主要包括以下接口:
-
Collection接口:是所有集合接口的根接口,提供了基本的集合操作,如添加、删除、遍历等操作。
-
List接口:是Collection接口的子接口,提供了有序的集合,可以通过索引访问集合中的元素。
-
Set接口:也是Collection接口的子接口,提供了无序的集合,集合中不允许有重复元素。
-
Map接口:是一个映射接口,提供了一种将键映射到值的方式,可以通过键来访问值。
框架体系图:
Java集合框架中的实现类主要有:
1.ArrayList类:实现了List接口,提供了可变长度的数组,可以通过索引访问集合中的元素。
基本使用示例:
List list = new ArrayList(10); //创建一个ArrayList集合(接口),集合的初始容量为10;若未给集合设置容量,默认容量为10
list.add("张三"); //新增一个元素到集合的最后面
list.add(1,"李四"); //新增一个元素到集合的指定下标(1)
//将一个集合中的所有元素追加到另一个集合的后面
List list2 = new ArrayList();
list2.add("王五");
list2.add("赵六");
list2.add("小七");
list .addAll(list2); //将list2(集合)中的所有元素追加到list(集合)中;也可多加一个下标,就是将list2(集合)的所有元素添加到list(集合)中的指定下标位置,例如:list.addAll(1,list2);
for (Object name: list //循环遍历list集合中的所有元素
) {
System.out.println(name);
}
控制台:
特点如下:
- 大小可变:ArrayList类可以根据需要自动调整大小。
- 随机访问:ArrayList类支持随机访问,可以像数组一样使用索引来访问元素。
- 速度快:ArrayList类通常比Vector类更快,因为它是多线程,线程是不安全的。
- 可以包含任何类型的对象:ArrayList类可以容纳任何类型的对象,包括基本类型和引用类型。
- 查询效率高:因为有索引可以肆意查询任意元素,但在插入删除方面较慢,因为这两个操作一旦发生,后面所有元素的索引都随之改变,例如删除一个元素,那么此元素后面的所有元素都会自动往前顶一位;插入一个元素,那么此元素后的所有元素都会自动往后推一位
2.LinkedList类:同样实现了List接口,提供了基于链表的集合,可以高效地进行插入和删除操作。
基本使用示例:
LinkedList list = new LinkedList(); //创建一个LinkedList集合(接口)
list.add("a"); //将指定元素(a)追加到此列表(list)的末尾
list.add(1, "b"); //在此列表(list)中的指定下标位置(1)插入指定的元素(b)
LinkedList list2 = new LinkedList(); //创建另一个LinkedList集合
list2.add(123); //初始一个数据
list.addAll(list2); //将指定集合(list2)中的所有元素追加到此列表(list)的末尾
LinkedList list3 = new LinkedList(); //创建另一个LinkedList集合
list3.add(456); //初始一个数据
list.addAll(1, list3); //将指定集合(list3)中的所有元素插入到此列表(list)中,从指定的下标位置(1)开始
list.addFirst("c"); //新增一个元素到集合的第一个位置
list.addLast("d"); //新增一个元素到集合的最后一个位置
boolean isIn = list.contains("a"); //如果此列表(list)包含指定元素(a),则返回true,反之返回false
System.out.println(isIn);
for (Object info:list //循环遍历list集合中的所有元素
) {
System.out.println(info);
}
控制台:
特点如下:
- 链结点:LinkedList中每个元素都是一个链结点对象,每个链结点对象包括该元素的值和前后两个链结点的引用。
- 随机访问:由于LinkedList没有像数组一样的索引,因此不能像ArrayList那样进行随机访问。
- 插入和删除效率快:LinkedList在进行插入和删除操作时,只需要修改前后链结点的引用即可,因此这些操作比ArrayList快。
- 内存占用少:由于LinkedList的实现方式,每个元素只需要存储它的值和前后两个链结点的引用,因此内存占用比ArrayList少。
3.Vector类:是一个动态数组,它可以在运行时自动调整大小。它类似于数组,但它的大小是可变的,而不是固定的。
基本使用示例:
Vector vector = new Vector(10, 3); //创建Vector集合容量为10,容量增量的空向量为3
vector.add("张三"); //新增一个指定元素到Vector的末尾
vector.add(1, "李四"); //新增一个指定元素到Vector的指定下标位置
vector.addElement(6);
System.out.print("第一个元素:" + vector.get(1));
System.out.println("返回克隆:" + vector.clone()); //返回此向量的克隆
Object[] ojb = new Object[5];
vector.copyInto(ojb); //将集合中的所有元素复制到指定数组(ojb)中
for (Object info:ojb
) {
System.out.println(info);
}
控制台:
特点如下:
-
Vector是一个可以自动增长和缩小的动态数组,它能够存储任意数据类型的对象。
-
Vector是单线程,所以线程是安全的,在多线程环境下,可以通过synchronized关键字来保证Vector中的操作是原子性的。
-
Vector实现了List接口,因此它可以使用List中定义的方法,如:add()、remove()、get()等。
-
Vector中的元素可以通过索引来访问和修改,索引的范围从0到size()-1。
-
Vector中的元素可以重复,也可以为null值。
-
Vector在添加或删除元素时,如果容量不足会自动增长容量,以保证元素能够全部存储。
-
Vector还提供了一些其他的方法,如:capacity()、ensureCapacity()、setSize()等。
4.HashSet类:实现了Set接口,提供了无序的集合,不允许有重复元素。
基本使用示例:
Map<Integer, String> list = new HashMap(); //创建一个Map集合(接口),键指定为Integer类型,值指定为String类型
//在集合中新增三个键值对
list.put(1, "张三");
list.put(2, "李四");
list.put(3, "王五");
//获取一个键的值
System.out.println(list.get(1));
Set set = list.keySet(); //获取所有的键并存储到集合(Set)中
for (Object info:set
) {
System.out.println("键:" + info + "\t\t值:" + list.get(info));
}
控制台:
特点如下:
-
HashSet实现了Set接口,因此它不能包含重复的元素;HashSet也是一个无序的集合,并不能保证元素的顺序。
-
HashSet使用哈希表来存储元素,因此它可以快速地进行添加、删除、查找等操作。
-
HashSet不是线程安全的,如果多个线程同时操作同一个HashSet实例,可能会导致意想不到的结果。
-
HashSet可以包含null元素,但只能包含一个null元素。
5.TreeMap类:实现了Map接口,提供了一种基于红黑树的映射,可以通过键来访问值,键是有序的。
基本使用示例:
TreeMap<Integer, String> map = new TreeMap<>(Comparator.reverseOrder());
map.put(3, "val");
map.put(2, "val");
map.put(1, "val");
map.put(5, "val");
map.put(4, "val");
System.out.println(map);
控制台:
特点如下:
-
TreeMap是一个有序的集合,它根据键的自然顺序进行排序,或按照构造函数中提供的Comparator进行排序。
-
TreeMap中不允许存储重复的键。如果试图添加已经存在的键,它将会覆盖之前的值。
-
TreeMap实现了SortedMap接口,因此它可以使用SortedMap中定义的方法,如:firstKey()、lastKey()、subMap()等。
-
TreeMap使用红黑树来存储元素,因此它可以快速地进行添加、删除、查找等操作,时间复杂度为O(log n)。
-
TreeMap不是线程安全的,如果多个线程同时操作同一个TreeMap实例,可能会导致意想不到的结果。
-
TreeMap可以包含null键,但不可以包含null值。
在Java集合框架中还包括了一些算法,如排序算法和查找算法。
Java集合框架提供了非常强大的功能,可以方便地进行各种集合操作,大大提高了Java程序的开发效率。