集合即容器!
开发和学习中需要时刻和数据打交道,如何组织这些数据是我们编程中重要的内容。我们一般通过“容器”来容纳和管理数据。事实上,我们前面所学的数组就是一种容器,可以在其中放置对象或基本类型数据。
1. 数组
数组的优势:是一种简单的线性序列,可以快速地访问数组元素,效率高。如果从效率和类型检查的角度讲,数组是最好的。
数组的劣势:不灵活。容量需要事先定义好,不能随着需求的变化而扩容。比如:我们在一个用户管理系统中,要把今天注册的所有用户取出来,那这样的用户有多少个?在写程序时是无法确定的。因此,在这里就不能使用组。
==> 基于数组并不能满足我们对于“管理和组织数据的需求”,所以我们需要一种更强大、更灵活、容量随时可扩的容器来装载我们的对象。 这就是我们今天要学习的容器。容器(Collection)也称之为集合。
集合:
存放对象的容器
1. 只能用于存放对象
Java中每一种基本数据类型都有对应引用类型
2. 集合存放的是多个对象的引用,对象本身还是存放在堆中
3. 集合可以存放不同类型,不限数量的数据类型
2. 容器的结构
2.1 结构图
单例集合: 将数据一个一个的进行存储。
双例集合:基于Key与Value的结构存储数据。
3. Collection接口
Collection是单例集合类的顶级接口。它提供对集合对象进行基本操作的通用接口方法。它的直接继承接口有List,Set和Queue.
Collection 接口中的抽象方法
方法 | 说明 |
---|---|
boolean add(Object element) | 增加元素到容器中 |
boolean remove(Object element) | 从容器中移除元素 |
boolean contains(Object element) | 容器中是否包含该元素 |
int size | 容器中元素的数量 |
boolean isEmpty() | 容器是否为空 |
void clear | 清空容器中所有元素 |
Iterator iterator() | 获得迭代器,用于遍历所有元素 |
boolean containsAll(Collection c) | 本容器是否包含c容器中的所有元素 |
boolean addAll(Collection c) | 将容器c中所有元素增加到本容器 |
boolean removeAll(Collection c) | 移除本容器和容器c中都包含的元素 |
boolean retainAll(Collection c) | 取本容器和容器中都包含的元素,移除非交集元素 |
Object[] toArray() | 转化成Object 数组 |
由于List、Set是Collection的子接口,意味着所有List、Set的实现类都有上面的方法。
4. List 接口介绍
4.1 List 的特点
-
有序:有序(元素存入集合的顺序和取出的顺序一致)。List中每个元素都有索引标记。可以根据元素的索引标记(在List中的位置)访问元素,从而精确控制这些元素。
-
可重复:List允许加入重复的元素。更确切地讲,List通常允许满足e1.equals(e2) 的元素重复加入容器。
4.1 List 的常用方法
除了Collection接口中的方法,List多了一些跟顺序(索引)有关的方法,参见下表:
方法 | 说明 |
---|---|
void add (int index, Object element) | 在指定位置插入元素,以前元素全部后移一位 |
Object set (int index,Object element) | 修改指定位置的元素 |
Object get (int index) | 返回指定位置的元素 |
Object remove (int index) | 删除指定位置的元素,后面元素全部前移一位 |
int indexOf (Object o) | 返回第一个匹配元素的索引,如果没有该元素,返回-1. |
int lastindexOf (Object o) | 返回最后一个匹配元素的索引,如果没有该元素,返回-1 |
4.3 ArrayList 容器类
ArrayList 是 List 接口的实现类。是 List 存储特征的具体实现。所以能够实现Collection和List接口的方法。 ArrayList底层是用数组实现的存储。
特点:查询效率高,增删效率低,线程不安全!
Vector 线程是安全的(不推荐使用)
package day04;
import java.util.ArrayList;
import java.util.List;
public class Test3 {
public static void main(String[] args) {
//直接new一个ArrayList类
List<String> list = new ArrayList<String>();
//往容器添加元素
list.add("5");
list.add("2");
list.add("0");
System.out.println(list.get(2));//允许使用重复元素,可通过索引来访问指定位置的元素
//默认按元素添加位置设置元素索引
//按索引在指定位置添加:list.add(0, "6");
list.add(0, "6");
System.out.println(list);
List<String> l = new ArrayList<String>();
l.add("123");
l.add("456");
//插入集合
list.addAll(l);
//指定位置插入集合:list.addAll(2, l);
list.addAll(2, l);
System.out.println(list);
System.out.println(list.indexOf("5"));//第一个下标:list.indexOf("5")
System.out.println(list.lastIndexOf("5"));//最后一个下标:list.lastIndexOf("5")
list.set(1, "你好");//修改指定元素:list.set(1, "你好");
System.out.println(list);
//截取指定位置元素:List<String> sub = list.subList(1, 2);
List<String> sub = list.subList(1, 2);
System.out.println(sub);
System.out.println(list.size());//指定数组的长度
}
}