目录
在编程时,可以使用数组来保存多个对象,但数组长度不可变化,一旦在初始化数组时制定了数组长度,这个数组长度就是不可变的。如果需要保存数量变化的数据,数组就有点无能为力了。而且数组无法保存具有映射关系的数据,key-value,数据看上去像两个数组,但这两个数组的元素之间有一定的关联关系。
为了保存数量不确定的数据,以及保存具有映射关系的数据(也被称为关联数组),Java提供了集合类。集合类主要负责保存、盛装其他数据,因此集合类也被称为容器类。Java所有的集合类都位于java.util
包下,提供了一个表示和操作对象集合的同意构架,包含大量集合接口,以及这些接口的实现类和操作方法。
集合类和数组不一样,数组元素既可以是基本类型的值,也可以是对象(实际上保存的是对象的引用变量),而集合里只能保存对象(实际上只是保存对象的引用变量)。
Java集合类型分为Collection 和 Map,它们是Java集合的根接口,这两个接口又包含了一些子接口或实现类。
集合
概念: 对象的容器,存储对象的对象,可代替数组
特点: 容器的工具类,定义了对多个对象进行操作的常用方法
位置: java.util.*;
集合与数组的区别
1.集合的容量可变,数组的容量不可变
2.数组只能存储单一类型的数据,集合可以存放各种类型的数据
3.数组可以存放基本数据类型,集合只能存放引用数据类型,要存放基本数据类型,就要引用基本数据类型的包装类
4.数组类型空间必须连续且支持下标访问,集合内存空间可以连续也可以不连续。
5.集合可以以一段连续的内存空间(数组)作为底层容器,也可以使用链表作为底层容器。以数组为底层容器的集合支持下标访问,链表不支持;使用链表作为底层容器时,增删不会移动大量元素,但数组会移动大量元素(尾部增删除外)
集合框架
用于存储数据的容器
集合框架是为表示和操作集合而规定的一种统一的标准的体系结构。
任何集合框架都包含三大块内容: 对外的接口、接口的实现和集合运算的算法。
接口: 表示集合的抽象数据类型。接口允许我们操作集合时不必关注集体实现——达到"多态" 例如: Collection、List、Set、Map
等
实现: 集合接口的具体实现。可重复使用的数据结构 例如: ArrayList、LinkedList、HashSet、HashMap
Collection和Collections的区别
Collections是一个工具类,具体可以实现Shuffle()打乱元素顺序,Reverse是将集合翻转,sort()是对元素进行升序排序
Collection是Set,List, Vector集合的父类接口
算法:是实现集合接口的对象里的方法执行的 一些有用的计算。例如: 查找、排序。
java集合框架提供了一套性能优良,使用方便的接口和类,java集合框架需要导包。
特点
对象封装数据,对象多了也需要存储。集合用于存储对象。
对象的个数确定可以使用数组,对象的个数不确定可以使用集合(集合可变长)。
集合接口
-
Collection接口 是最基本的集合接口,存储单列数据的根接口,表示一组对象。一些Collection允许有重复元素,而另一些不允许。一些Collection是有序的,而另一些是无序的。JDK不提供此接口的任何直接实现,只提供更具体的子接口(List 和 Set)
-
List接口 是一个有序的Collection 使用此接口能够精确的控制每个元素插入的位置,能够通过索引来访问List中的元素,允许有相同的元素和null。
-
Set接口 具有与Collection完全一样的接口,只是行为上不同,Set不保存重复的元素,最大包含一个null元素,不要求有序,没有索引。
-
Map接口 存储映射关系的接口,将键映射到值的对象---键值对。不能包含重复的键;每个键最多只能映射到一个值(
key:value
1对1 多对1)。没有索引,根据键来操作。 -
Queue接口 Queue是Java提供的队列实现,有点类似List。
-
Dueue接口 是Queue的一个子接口,为双向队列。
-
Iterator接口 集合的输出接口,主要用于遍历输出(即迭代访问)Collection集合中的元素,Iterator对象被称之为迭代器。迭代器接口是集合接口的父接口,实现类实现Collection时就必须实现Iterator接口。
Java集合实现类的作用
类名称 | 作用 |
---|---|
HashSet | 为优化査询速度而设计的 Set。它是基于 HashMap 实现的,HashSet 底层使用 HashMap 来保存所有元素,实现比较简单 |
TreeSet | 实现了 Set 接口,是一个有序的 Set,这样就能从 Set 里面提取一个有序序列 |
ArrayList | 一个用数组实现的 List,能进行快速的随机访问,效率高而且实现了可变大小的数组 |
ArrayDueue | 是一个基于数组实现的双端队列,按“先进先出”的方式操作集合元素 |
LinkedList | 对顺序访问进行了优化,但随机访问的速度相对较慢。此外它还有 addFirst()、addLast()、getFirst()、getLast()、removeFirst() 和 removeLast() 等方法,能把它当成栈(Stack)或队列(Queue)来用 |
HashMap | 按哈希算法来存取键对象 |
TreeMap | 可以对键对象进行排序 |
Collection
接口
Collection接口是List、Set和Queue接口的父接口,通常情况下不被直接使用。Collection接口定义了一些通用的方法,通过这些方法可以实现对集合的基本操作。定义的方法既可以用于操作Set集合,也可用于List和Queue集合。
方法名称 | 说明 |
---|---|
boolean add(E e) | 向集合中添加一个元素,如果集合对象被添加操作改变了,则返回 true。E 是元素的数据类型 |
boolean addAll(Collection c) | 向集合中添加集合 c 中的所有元素,如果集合对象被添加操作改变了,则返回 true。 |
void clear() | 清除集合中的所有元素,将集合长度变为 0。 |
boolean contains(Object o) | 判断集合中是否存在指定元素 |
boolean containsAll(Collection c) | 判断集合中是否包含集合 c 中的所有元素 |
boolean isEmpty() | 判断集合是否为空 |
Iterator<E>iterator() | 返回一个 Iterator 对象,用于遍历集合中的元素 |
boolean remove(Object o) | 从集合中删除一个指定元素,当集合中包含了一个或多个元素 o 时,该方法只删除第一个符合条件的元素,该方法将返回 true。 |
boolean removeAll(Collection c) | 从集合中删除所有在集合 c 中出现的元素(相当于把调用该方法的集合减去集合 c)。如果该操作改变了调用该方法的集合,则该方法返回 true。 |
boolean retainAll(Collection c) | 从集合中删除集合 c 里不包含的元素(相当于把调用该方法的集合变成该集合和集合 c 的交集),如果该操作改变了调用该方法的集合,则该方法返回 true。 |
int size() | 返回集合中元素的个数 |
Object[] toArray() | 把集合转换为一个数组,所有的集合元素变成对应的数组元素。 |
public class Demo {
public static void main(String[] args) {
ArrayList list1 = new ArrayList();
ArrayList list2 = new ArrayList();
//创建集合list1和list2
list1.add("one");
list1.add("two");
//向list1添加元素
list2.addAll(list1);
list2.add("three");
//将list1的所有元素添加到list2
//向list2添加元素
System.out.println("list2集合中的元素如下:" );
Iterator it = list2.iterator();
while(it.hasNext()) {
System.out.print(it.next()+" ");
}
}
}
//输出为:
/*list2集合中的元素如下:
one two three
/
由于Collection是接口,不能对其实例化,上述代码使用了Collection接口的ArrayList
实现类来调用Collection的方法。add()方法可以向Collection中添加一个元素,而调用addAll
()方法可以将指定Collection中的所有元素添加到另一个Collection中。
public static void main(String[] args) {
ArrayList list1 = new ArrayList();
ArrayList list2 = new ArrayList();
//创建集合list1和list2
list1.add("one");
list1.add("two");
list1.add("three");
System.out.println("list1集合中的元素数
量:"+list1.size());
//输出list1中的元素数量
list2.add("two");
list2.add("four");
list2.add("six");
System.out.println("list2集合中的元素数
量:"+list2.size());
//输出list12中的元素数量
list2.remove(2);
//删除list2中的第三个元素
System.out.println("使用remove方法之后的list2的元素数
量:"+list2.size());
System.out.println("list2 集合中的元素如下:");
Iterator it1 = list2.iterator();
while (it1.hasNext()) {
System.out.print(it1.next() + " ");
}
list1.removeAll(list2);
System.out.println("\nremoveAll()方法之后 list1 集合中
的元素数量:" + list1.size());
System.out.println("list1 集合中的元素如下:");
Iterator it2 = list1.iterator();
while (it2.hasNext()) {
System.out.print(it2.next() + " ");
}
}
//输出为:
/*
list1集合中的元素数量:3
list2集合中的元素数量:3
使用remove方法之后的list2的元素数量:2
list2 集合中的元素如下:
two four
removeAll()方法之后 list1 集合中的元素数量:2
list1 集合中的元素如下:
one three
*/
list2 集合在调用 remove(2) 方法删除第 3 个元素之后剩下了 two 和 four。list1.removeAll(list2) 语句会从 list1 中将 list1 和 list2 中相同的元素删除,即删除 two 元素。
注意: retainAll( )
方法的作用与 removeAll( )
方法相反,即保留两个集合中相同的元素,其他全部删除。