文章目录
集合
一、集合概述
Java中的结合就像一个容器,专门用来存储Java对象(实际上是对象的引用,但习惯称为对象),这些对象可以是任意的数据类型,并且长度可变。其中,这些集合类都位于java.util包中,在使用时一定要注意导包的问题,否则就会出现异常。
集合按照其存储结构可以分为两大类,即单列集合Collection和双列集合Map,这两种集合的特点具体如下:
- Collection:单列集合的根接口,用于存储一系列符合某种规则的元素。Collection集合有两个重要的子接口,分别是List和Set。其中,List集合的特点是元素有序、可重复;Set集合的特点是元素无序并且不可重复。List接口的主要实现类有ArrayList和LinkedList;Set接口的主要实现类有HashSet和TreeSet。
- Map:双列集合的根接口,用于存储具有键(Key)、值(Values)映射关系的元素。Map集合中每个元素都包含一对键值,并且Key是唯一的,在使用Map集合时可以通过制定的Key找到对应的Value。例如根据一个学生的学号就可以找到对应的学生。Map接口的主要实现类有HashMap和TreeMap。
集合体系核心结构
虚线框
里都是接口类型
,实线框
里填写的都是具体的实现类
。
二、Collection接口
Collection是所有单列集合的根接口,因此在Collection中定义了单列集合(List和Set)的一些通用方法。
Collection接口的主要方法
三、List接口
3.1 List接口简介
定义:List接口继承自Collection接口,是单列集合的一个重要分支,习惯性的会将实现了List接口的对象称为List集合。
特点:
- List集合中允许出现重复元素,所有的元素是以一种线性方式进行存储的,在程序中可以通过索引(类似于数组中的元素角标)来访问集合中的元素。
- List集合还有一个特点就是元素有序,即元素的存入顺序和取出顺序一致。
List接口的主要方法
3.2 ArrayList集合
说明:
- ArrayList是List接口的一个实现类,它是程序中最常见的一种集合。
- ArrayList内部的数据存储结构是数组形式。
特点:
- 由于ArrayList的存储结构,在增加或删除指定位置的元素时,会创建新的数组,效率比较低,因此不适合做大量的增删操作。
- 这种数组结构允许程序通过索引的方式来访问元素,使用ArrayList集合在遍历和查找元素时显得非常高效。
3.2.1 代码示例
import java.util.ArrayList;
public class Demo01ArrayList {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
ArrayList<Integer> list = new ArrayList<Integer>();
// list.add("菜鸟1");
// list.add("菜鸟2");
// list.add("菜鸟3");
// list.add("菜鸟4");
// list.add("菜鸟5");
list.add(1);
list.add(5);
list.add(10);
//在索引为1的位置上,插入数据8
list.add(1, 8);
System.out.println("集合长度:" + list.size());
System.out.println("获取第2个元素:" + list.get(1));
// System.out.println("删除第4号元素:" + list.remove(3));
//遍历每一个元素
for (int i = 0; i < list.size(); i++) {
Object o = list.get(i);
System.out.println(o.toString());
}
}
}
3.3 LinkedList集合
说明:
- LinkedList是List接口的另一个实现类。
- LinkedList内部包含有两个Node类型的first和last属性的双向循环链表结构。
特点:
- 由于LinkedList的存储结构, LinkedList集合对于元素的遍历和查找效率较低。
- LinkedList集合对于元素的增删操作表现出很高的效率。
双向循环链表结构
左图为新增元素,图中的元素1和元素2在集合中彼此为前后关系,在它们之间新增一个元素时,只需要让元素1记住它后面的元素是新元素,让元素2记住它前面的元素为新元素就可以了。
右图为删除元素,要想删除元素1和元素2之间的元素3,只需要让元素1与元素2变成前后关系就可以了。
LinkedList中特有的方法
import java.util.LinkedList;
public class Demo02LinkedList {
public static void main(String[] args) {
LinkedList link = new LinkedList();
//1.添加元素
link.add("stu1");
link.add("stu2");
link.add("stu3");
System.out.println(link); //输出集合中的元素
link.offer("offer"); //向集合尾部追加元素
link.push("push"); //向集合头部添加元素
System.out.println(link); //输出集合中的元素
//2.获取元素
Object obj = link.peek(); //获取集合的第一个元素
System.out.println(obj); //输出集合中的元素
//3.删除元素
link.removeFirst(); //删除集合第一个元素
link.pollLast(); //删除集合最后一个元素
System.out.println(link);
}
}
四、Collection集合遍历
4.1 Iterator遍历集合
定义:
Iterator接口是Java集合框架中的一员,主要用于迭代访问(即遍历)Collection中的元素,因此 Iterator 对象也被称为迭代器。
4.1.2 Iterator工作原理
Iterator遍历集合时,内部采用指针的方式来跟踪集合中的元素。在调用next()方法之前,索引位于第一个元素之前,不指向任何元素。
- 第一次调用next()方法后,索引会向后移动一位,指向第一个元素并将该元素返回;
- 再次调用next()方法时,索引会指向第二个元素并将该元素返回;
- 以此类推,直到hasNext()方法返回false,表示到达了集合的末尾终止对元素的遍历。
4.1.3 代码示例
import java.util.ArrayList;
import java.util.Iterator;
/**
* @program: Demo03Iterator
* @description:
* @author: OriginalCoder
* @createtime:2020/11/21 10:37
**/
public class Demo03Iterator {
public static void main(String[] args) {
//创建ArrayList集合
ArrayList list = new ArrayList();
//向集合中添加字符串
list.add("菜鸟");
list.add("大佬");
list.add("大牛");
//获取Iterator对象
Iterator iterator = list.iterator();
//判断集合中是否存在下一个元素
while (iterator.hasNext()) {
//取出ArrayList集合中的元素
Object obj = iterator.next();
System.out.println(obj);
}
}
}
4.2 foreach遍历集合
定义:
foreach循环是一种更加简洁的for循环,也称增强for循环,用于遍历数组或集合中的元素。
代码示例:
import java.util.ArrayList;
/**
* @program: Demo04ForEach
* @description:
* @author: OriginalCoder
* @createtime:2020/11/21 10:53
**/
public class Demo04ForEach {
public static void main(String[] args) {
ArrayList list = new ArrayList();
list.add("菜鸟");
list.add("大佬");
list.add("大牛");
//使用foreach循环遍历集合
for (Object obj:list) {
System.out.println(obj);
}
}
}
注意:
- foreach循环遍历集合和数组时,只能访问集合中的元素,不能对其中的元素进行修改。
- Iterator迭代器对集合中的元素进行迭代时,如果调用了集合对象的remove()方法删除元素,会出现ConcurrentModificationException异常。