{"content":{"title":"【Java集合】来了两个“插班生”如何打印花名册，以数组案例带你搞懂Collection集合概念","body":"## 前言\r\n\r\n这个系列是我在学习Java集合这部分时候，结合书籍和Java提供的api整理的部分知识，也参考了一些网络上的文章，如果错误，望大家指出。希望本系列文章对大家学习Java有所帮助，也可以回顾下这部分的基础知识，温故而知新。\r\n\r\n## 集合概述\r\n\r\n\r\n#### **1.1 数组的特点**\r\n\r\nJava是一种面向对象语言，对一个事物的描述都是以对象的形式存在，为了方便操作这些对象，就需要把这些对象存储起来。为容纳一组对象，我们最适宜的选择就是Array数组；而且容纳一系列的基础数据类型的话，更是必须采用数组。\r\n\r\n\r\n我们通过一个小案例来回顾一下之前的数组知识。数组不仅可以存放基本数据类型也可以容纳属于同一种类型的对象。\r\n\r\n**数组案例：一个小班有三个学生，请打印学生的姓名和年龄？**\r\n\r\n步骤：\r\n\r\n* 有三个学生，放在一个长度为3的数组花名册\r\n* 打印学生\r\n* 突然来了两个插班生，请放在数组花名册中\r\n* 无法插入，通过重新定义一个新的数组，组成新的花名册\r\n\r\n\r\n下面我们来实现这个案例：\r\n\r\n1.首页创建一个 javaee 的项目\r\n\r\n![image.png](https://img.learnblockchain.cn/attachments/2023/10/bBp6XvMW6538b9af649d1.png)\r\n\r\n\r\n\r\n2.输入名称 collectPractice，选择对应的 JDK 版本 1.8\r\n\r\n![image.png](https://img.learnblockchain.cn/attachments/2023/10/XAkVrgWV6538ba3655da2.png)\r\n\r\n\r\n3.新增 Class  student\r\n\r\n![image.png](https://img.learnblockchain.cn/attachments/2023/10/wBJmDk9N6538bbb2d56b0.png)\r\n\r\n\r\n4.文件内容如下：\r\n ```java\r\n public class Student {\r\n        private String name;\r\n        private int age;\r\n    \r\n        public Student(String name, int age) {\r\n            this.name = name;\r\n            this.age = age;\r\n        }\r\n    \r\n        public String getName() {\r\n            return name;\r\n        }\r\n    \r\n        public void setName(String name) {\r\n            this.name = name;\r\n        }\r\n    \r\n        public int getAge() {\r\n            return age;\r\n        }\r\n    \r\n        public void setAge(int age) {\r\n            this.age = age;\r\n        }\r\n    \r\n        @Override\r\n        public String toString() {\r\n            return \"Student{\" +\r\n                    \"name='\" + name + '\\'' +\r\n                    \", age=\" + age +\r\n                    '}';\r\n        }\r\n    }\r\n\r\n```\r\n\r\n> 编程学习，从云端源想开始，课程视频、在线书籍、在线编程、一对一咨询……你想要的全部学习资源这里都有，重点是统统免费！[点这里即可查看](https://www.ydcode.cn/officialHome?sourceId=85)\r\n\r\n\r\n\r\n5.在 Main.java 中，我们将要完成的需求写到注释中，逐行去打印结果\r\n```java\r\n public class Main {\r\n        public static void main(String[] args) {\r\n    \r\n            /*\r\n            我们的业务需求是这样的：\r\n                  1. 有三个学生，放在一个长度为3的数组花名册\r\n                  2. 打印学生\r\n                  3. 突然来了两个插班生，请放在数组花名册中\r\n                  4. 请获取第三个学生的姓名\r\n            * */\r\n    \r\n            //定义一个数组，存储我们的数据\r\n            Student[] students = new Student[3];\r\n            Student student1 = new Student(\"麦迪\", 29);\r\n            Student student2 = new Student(\"库里\", 29);\r\n            Student student3 = new Student(\"杜兰特\", 29);\r\n    \r\n    \r\n            //记录设置到数组中\r\n            students[0] = student1;\r\n            students[1] = student2;\r\n            students[2] = student3;\r\n    \r\n            //打印 花名册 通过数组工具\r\n            System.out.println(\"学生花名册---\"+ Arrays.toString(students));\r\n        }\r\n    }\r\n```\r\n结果：\r\n\r\n![image.png](https://img.learnblockchain.cn/attachments/2023/10/mRCFH4je6538be7b3b8ef.png)\r\n\r\n\r\n6.来了两个新学生，也要加入到花名册中，直接使用数组添加，打印花名册，发现报错\r\n\r\n```java\r\nimport java.util.Arrays;\r\n\r\n    public class Main {\r\n        public static void main(String[] args) {\r\n    \r\n            /*\r\n            我们的业务需求是这样的：\r\n                  1. 有三个学生，放在一个长度为3的数组花名册\r\n                  2. 打印学生\r\n                  3. 突然来了两个插班生，请放在数组花名册中\r\n                  4. 请获取第三个学生的姓名\r\n            * */\r\n    \r\n            //定义一个数组，存储我们的数据\r\n            Student[] students = new Student[3];\r\n            Student student1 = new Student(\"麦迪\", 29);\r\n            Student student2 = new Student(\"库里\", 29);\r\n            Student student3 = new Student(\"杜兰特\", 29);\r\n    \r\n    \r\n            //记录设置到数组中\r\n            students[0] = student1;\r\n            students[1] = student2;\r\n            students[2] = student3;\r\n    \r\n            //打印 花名册 通过数组工具\r\n            System.out.println(\"学生花名册---\"+ Arrays.toString(students));\r\n    \r\n            //两个插班生\r\n            Student student4 = new Student(\"科比\", 40);\r\n            Student student5 = new Student(\"欧文\", 25);\r\n    \r\n            students[3] = student4;\r\n            students[4] = student5;\r\n    \r\n            System.out.println(\"学生花名册---\"+ Arrays.toString(students));\r\n        }\r\n    }\r\n```\r\n打印结果：\r\n\r\n![image.png](https://img.learnblockchain.cn/attachments/2023/10/Bl6aaQYB6538bef9e2ee4.png)\r\n\r\n\r\n7.所以在此时，我们需要重新 new 一个 长度为 5 的数组，重新设置新的花名册\r\n\r\n```java\r\n  public class Main {\r\n        public static void main(String[] args) {\r\n    \r\n            /*\r\n            我们的业务需求是这样的：\r\n                  1. 有三个学生，放在一个长度为3的数组花名册\r\n                  2. 打印学生\r\n                  3. 突然来了两个插班生，请放在数组花名册中\r\n                  4. 请获取第三个学生的姓名\r\n            * */\r\n    \r\n            //定义一个数组，存储我们的数据\r\n            Student[] students = new Student[3];\r\n            Student student1 = new Student(\"麦迪\", 29);\r\n            Student student2 = new Student(\"库里\", 29);\r\n            Student student3 = new Student(\"杜兰特\", 29);\r\n    \r\n    \r\n            //记录设置到数组中\r\n            students[0] = student1;\r\n            students[1] = student2;\r\n            students[2] = student3;\r\n    \r\n            //打印 花名册 通过数组工具\r\n            System.out.println(\"学生花名册---\"+ Arrays.toString(students));\r\n    \r\n            //两个插班生\r\n            Student student4 = new Student(\"科比\", 40);\r\n            Student student5 = new Student(\"欧文\", 25);\r\n    \r\n    //        students[3] = student4;\r\n    //        students[4] = student5;\r\n    //\r\n    //        System.out.println(\"学生花名册---\"+ Arrays.toString(students));\r\n    \r\n            Student[] studentsNew = new Student[5];\r\n            for (int i = 0; i < students.length; i++) {\r\n                studentsNew[i] = students[i];\r\n            }\r\n            studentsNew[3] = student4;\r\n            studentsNew[4] = student5;\r\n    \r\n    \r\n            System.out.println(\"学生花名册---\"+Arrays.toString(students));\r\n            System.out.println(\"学生新的花名册---\"+Arrays.toString(studentsNew));\r\n        }\r\n    }   \r\n```\r\n打印结果：\r\n\r\n![image.png](https://img.learnblockchain.cn/attachments/2023/10/5m8akioe6538bf5de6a0f.png)\r\n\r\n\r\n**分析结论**\r\n\r\n* 数组长度在初始化后，就确定了，不能更改，不便于存储数量的扩展。比如我们再来了两个插班生，直接往元素组添加元素，会报错误信息。\r\n* 数组提供的属性和方法少，不便于操作。比如我们在打印花名册时，需要借助工具类的toString方法。\r\n* 存储的类型可以是基本类型，也可以是对象，但是必须是同一类型。\r\n\r\n\r\n因为数组存在的这些缺点，Java语言又为我们提供了一种新的存储数据并且存储空间可变的容器，这就是我们Java集合的概念。它和数组一样，都是可以存储数据的容器，一种存储空间可变的存储模型，并且存储的数据容量可以随时发生改变。\r\n\r\n\r\n\r\n#### **1.2 集合的特点**\r\n\r\n最后我们来总结一下集合的特点：\r\n\r\n* 可以动态保存任意多的对象，使用方便；\r\n* 集合提供了一系列操作元素的方法，使集合元素的添加和修改等操作变得简单；\r\n* 集合还可以保存具有映射关系的关联数据；\r\n* 集合只能保存对象，实际上保存的是对象的引用地址。\r\n\r\n\r\n\r\n![微信图片_20230303152640.gif](https://img.learnblockchain.cn/attachments/2023/10/Ypm9Qk6r6538bfb1d3081.gif)"},"author":{"user":"https://learnblockchain.cn/people/17279","address":null},"history":null,"timestamp":1698218044,"version":1}