目录
引言
概念
体系特点
集合对于泛型的支持
Collection常用API
遍历方式
迭代器遍历
增强for循环
Lambda表达式
集合存储自定义类型的变量
在之前Java的学习过程中,我们已经学习过了数组,可以通过数组储存一些已知数量的数据,比如春夏秋冬、黑红梅芳、东南西北等数据,然而当我们想要储存其他未知数量的数据的时候,数组已经无法让我们使用了,这个时候我们引进集合的概念,可以帮助我们化解这个问题,集合所涉及的知识较多,因此会分为多个版块进行讲解。希望能够通过这篇文章帮助你加深对集合的理解以及在Java的学习过程之中更加优秀!
- 集合的大小不固定,启动后可以动态变化,类型也可以选择不固定,类似于一个没有限制的容器,随时都可以在里面装东西
- 集合非常适合做元素的增删操作
- 注意:集合中只能储存引用类型数据,如果要储存基本类型数据,可以选用包装类
- 使用场景:当存储数据的数量未知的情况下,可以通过定义集合来实现,可以有效的避免容量不够
集合共有两个体系,分别是Collection(单列)和Map(双列)
Collection单列集合,每个元素(数据)只保存一个值
Map双列集合,每个元素包含两个值(键值对)
tips:前期主要先掌握Collection集合体系的使用,因此今天我们主要讲解Collection的使用
Collection集合体系(其中黄色为接口类,蓝色为实现类)
- List系列集合:添加的元素是有序、可重复、有索引
- ArrayList、LinekdList:有序、可重复、有索引
- Set系列集合:添加的元素是无序、不重复、无索引
- HashSet:无序、不重复、无索引
- LinkedHashSet:有序、不重复、无索引
- TreeSet:按照大小默认升序排序、不重复、无索引
List系列集合:有序、可重复、有索引
Collection list = new Arrayslist(); list.add("石原里美"); list.add("石原里美"); list.add("工藤静香"); list.add(110); list.add(119); list.add(true); list.add(false); System.out.println(list); //输出结果: [石原里美,石原里美,工藤静香,110,119,true,false]
Set系列集合:无序、不重复、无索引
Collection list = new HashSet(); list.add("石原里美"); list.add("石原里美"); list.add("工藤静香"); list.add(110); list.add(119); list.add(true); list.add(false); System.out.println(list); //输出结果: [false, 工藤静香, 119, 石原里美, 110, true]
集合都是支持泛型的,可以在编译阶段约束集合只能操作某种数据类型
Collection
lists = new ArrayList (); Collection lists = new ArrayList();//JDK1.7开始后面的泛型类型可以省略不写 注意:集合和泛型都只能支持引用数据类型,不支持基本数据类型,所以集合中存储的元素都认为是对象
Collection
lists = new ArrayList<>();//报错 如果集合中要存储基本类型的数据怎么办?
Collection
lists = new ArrayList<>(); Collection lists = new ArrayList<>();
下面介绍一些在日常操作过程中,我们经常能够使用到的CollectionAPI:
public static void main(String[] args) { Collection
list = new ArrayList<>(); //1、添加元素,成功则返回true list.add("石原里美"); System.out.println(list.add("工藤静香")); System.out.println(list); System.out.println("------------------------"); //2、清空集合中的元素 list.clear(); System.out.println(list); System.out.println("------------------------"); //3、判断元素是否为空,是空返回true,反之则false System.out.println(list.isEmpty()); //4、获取集合的大小 System.out.println("------------------------"); System.out.println(list.size()); System.out.println("------------------------"); //5、判断集合中是否包含某个元素 list.add("石原里美"); list.add("工藤静香"); System.out.println(list.contains("石原里美")); System.out.println("------------------------"); //6、删除某个元素,若有重复,则默认删除第一个 list.add("石原里美"); System.out.println(list); list.remove("石原静香"); list.remove("石原里美"); System.out.println(list); System.out.println("------------------------"); //7、把集合转换成数组 Object[] array = list.toArray(); System.out.println(Arrays.toString(array)); System.out.println("------------------------"); //8、将一个集合中的元素添加到另一个集合中 Collection l1 = new ArrayList<>(); Collection l2 = new ArrayList<>(); l1.add("石原里美"); l1.add("工藤静香"); l2.add("朱茵"); l2.add("紫霞仙子"); l1.addAll(l2); System.out.println(l1); System.out.println(l2);//l2中的元素没有变化 } //输出结果: true [石原里美, 工藤静香] ------------------------ [] ------------------------ true ------------------------ 0 ------------------------ true ------------------------ [石原里美, 工藤静香, 石原里美] [工藤静香, 石原里美] ------------------------ [工藤静香, 石原里美] ------------------------ [石原里美, 工藤静香, 朱茵, 紫霞仙子] [朱茵, 紫霞仙子]
- 遍历就是一个一个的把容器中的元素访问一遍
- 迭代器在Java中的代表是iterator,迭代器是集合的专用遍历方式
Collection
list = new ArrayList<>(); list.add("石原里美"); list.add("工藤静香"); list.add("朱茵"); list.add("紫霞仙子"); Iterator it = list.iterator(); while(it.hasNext){//判断索引处有无值 System.out.println(it.next);//从零索引开始取值,取过值以后,索引后移 } //输出结果: 石原里美 工藤静香 朱茵 紫霞仙子
增强for循环:既可以遍历集合也可以遍历数组
它是JDK5之后出现的,其内部原理是一个lterator迭代器,遍历集合相当于是迭代器的简化写法
实现lterable接口的类才可以使用迭代器和增强for,Collection接口已经实现了lterable接口
格式:
for(元素数据类型 变量名 : 数组或者Collection集合){
在此处使用变量即可,该变量就是元素
}
Collection
list = new ArrayList<>(); for(String s : list){ System.out.println(s); } //输出结果(沿用前面的list): 石原里美 工藤静香 朱茵 紫霞仙子 int [] age = {10,18,25}; for(int a : age){ System.out.println(a); if(age==18){ age = 28;//改age无意义,只是修改了遍历的值,不会影响数组元素(值传递) } } //输出结果 10 18 25
得益于JDK8开始的新技术Lambda表达式,提供了一种更简单、更直接的遍历集合的方式
//之前学习的匿名内部类 Collection
list = new ArrayList<>(); list.forEach(new Consumer (){ @Override public void accept(String s){ System.out.println(s); } }); //简化为Lambda表达式 list.forEach(s->{ System.out.println(s); }); //或者更加简化: list.forEach(s -> System.out.println(s)); //输出结果(沿用前面的list): 石原里美 工藤静香 朱茵 紫霞仙子 其内核思想主要是集合的forEach方法(),只不过它是可以简化为Lambda表达式的形式,使得代码更加简便;接下来讲解一下该方法是如何使用的:
截图中的内容即是该方法的具体方法体,传入的参数即是上面代码通过new获取的对象,而接下来的语句即是增强for循环的格式,其中“T是元素数据类型,t是变量名,this则指代list集合”。
案例:创建一个Student类,分别创建两个对象s1和s2,并将这两个对象储存在集合之中,并通过刚学过的遍历方法进行输出。
//学生类的代码就不写了,篇幅过大,影响观感 //其中主要有四个变量 Collection
Students = new ArrayList<>(); Student s1 = new Student("张三","智能",18,1); Students.add(s1); Student s2 = new Student("李四","数据库",19,2); Students.add(s2); for(Student student:Students){ System.out.println("姓名:"+student.getName()); System.out.println("学号:"+student.getNum()); System.out.println("年龄:"+student.getAge()); System.out.println("班级:"+student.getClassroom()); System.out.println("-------------------------"); } //输出结果: 姓名:张三 学号:1 年龄:18 班级:智能 ------------------------- 姓名:李四 学号:2 年龄:19 班级:数据库 -------------------------
创作不易,给个三连