目录
集合和数组都是容器。
数组定义完成并启动后,类型确定、长度固定,适合元素的个数和类型确定的业务场景,不适合做需要增删数据操作。
集合的大小不固定,启动后可以动态变化,类型也可以选择不固定。集合更像气球。
集合非常适合做元素的增删操作。
1.数组和集合的元素存储的个数问题。
数组定义后类型确定,长度固定
集合类型可以不固定,大小是可变的。
2.数组和集合存储元素的类型问题。
数组可以存储基本类型和引用类型的数据。
集合只能存储引用数据类型的数据。
3.数组和集合适合的场景。
数组适合做数据个数和类型确定的场景。
集合适合做数据个数不确定,且要做增删元素的场景。
Collection单列集合,每个元素(数据)只包含一个值。
Map双列集合,每个元素包含两个值(键值对)。
List系列集合:添加的元素是有序、可重复、有索引。
ArrayList、LinekdList :有序、可重复、有索引。
Set系列集合:添加的元素是无序、不重复、无索引。
HashSet: 无序、不重复、无索引;LinkedHashSet: 有序、不重复、无索引。
TreeSet:按照大小默认升序排序、不重复、无索引。
集合都是支持泛型的,可以在编译阶段约束集合只能操作某种数据类型
注意:集合和泛型都只能支持引用数据类型,不支持基本数据类型,所以集合中存储的元素都认为是对象。
- import java.util.ArrayList;
- import java.util.Collection;
- import java.util.HashSet;
-
- /**
- 目标:明确Collection集合体系的特点
- */
- public class CollectionDemo1 {
- public static void main(String[] args) {
- // 有序 可重复 有索引
- Collection list = new ArrayList();
- list.add("Java");
- list.add("Java");
- list.add("Mybatis");
- list.add(23);
- list.add(23);
- list.add(false);
- list.add(false);
- System.out.println(list);
-
- // 无序 不重复 无索引
- Collection list1 = new HashSet();
- list1.add("Java");
- list1.add("Java");
- list1.add("Mybatis");
- list1.add(23);
- list1.add(23);
- list1.add(false);
- list1.add(false);
- System.out.println(list1);
-
- System.out.println("-----------------------------");
- // Collection<String> list2 = new ArrayList<String>();
- Collection<String> list2 = new ArrayList<>(); // JDK 7开始之后后面类型申明可以不写
- list2.add("Java");
- // list2.add(23);
- list2.add("zhangsan");
-
- // 集合和泛型不支持基本数据类型,只能支持引用数据类型
- // Collection<int> list3 = new ArrayList<>();
- Collection<Integer> list3 = new ArrayList<>();
- list3.add(23);
- list3.add(233);
- list3.add(2333);
-
- Collection<Double> list4 = new ArrayList<>();
- list4.add(23.4);
- list4.add(233.0);
- list4.add(233.3);
- }
- }
总结:
1.集合的代表是?
Collection接口。
2.Collection集合分了哪2大常用的集合体系?
List系列集合:添加的元素是有序、可重复、有索引。
Set系列集合:添加的元素是无序、不重复、无索引。
3.如何约定集合存储数据的类型,需要注意什么?
集合支持泛型。
集合和泛型不支持基本类型,只支持引用数据类型。
Collection集合
Collection是单列集合的祖宗接口,它的功能是全部单列集合都可以继承使用的。
Collection API如下:
- import java.util.ArrayList;
- import java.util.Arrays;
- import java.util.Collection;
-
- /**
- 目标:Collection集合的常用API.
- Collection是集合的祖宗类,它的功能是全部集合都可以继承使用的,所以要学习它。
- Collection API如下:
- - public boolean add(E e): 把给定的对象添加到当前集合中 。
- - public void clear() :清空集合中所有的元素。
- - public boolean remove(E e): 把给定的对象在当前集合中删除。
- - public boolean contains(Object obj): 判断当前集合中是否包含给定的对象。
- - public boolean isEmpty(): 判断当前集合是否为空。
- - public int size(): 返回集合中元素的个数。
- - public Object[] toArray(): 把集合中的元素,存储到数组中。
- 小结:
- 记住以上API。
- */
- public class CollectionDemo {
- public static void main(String[] args) {
- // HashSet:添加的元素是无序,不重复,无索引。
- Collection<String> c = new ArrayList<>();
- // 1.添加元素, 添加成功返回true。
- c.add("Java");
- c.add("HTML");
- System.out.println(c.add("HTML"));
- c.add("MySQL");
- c.add("Java");
- System.out.println(c.add("黑马"));
- System.out.println(c); // [Java, HTML, HTML, MySQL, Java, 黑马]
-
- // 2.清空集合的元素。
- // c.clear();
- // System.out.println(c);
-
- // 3.判断集合是否为空 是空返回true,反之。
- // System.out.println(c.isEmpty());
-
- // 4.获取集合的大小。
- System.out.println(c.size());
-
- // 5.判断集合中是否包含某个元素。
- System.out.println(c.contains("Java")); // true
- System.out.println(c.contains("java")); // false
- System.out.println(c.contains("黑马")); // true
-
- // 6.删除某个元素:如果有多个重复元素默认删除前面的第一个!
- System.out.println(c.remove("java")); // false
- System.out.println(c);
- System.out.println(c.remove("Java")); // true
- System.out.println(c);
-
- // 7.把集合转换成数组 [HTML, HTML, MySQL, Java, 黑马]
- Object[] arrs = c.toArray();
- System.out.println("数组:" + Arrays.toString(arrs));
-
- System.out.println("----------------------拓展----------------------");
- Collection<String> c1 = new ArrayList<>();
- c1.add("java1");
- c1.add("java2");
- Collection<String> c2 = new ArrayList<>();
- c2.add("赵敏");
- c2.add("殷素素");
- // addAll把c2集合的元素全部倒入到c1中去。
- c1.addAll(c2);
- System.out.println(c1);
- System.out.println(c2);
- }
- }
迭代器遍历概述
遍历就是一个一个的把容器中的元素访问一遍。
迭代器在Java中的代表是Iterator,迭代器是集合的专用遍历方式。
Collection集合获取迭代器
Iterator中的常用方法
- import java.util.ArrayList;
- import java.util.Collection;
- import java.util.Iterator;
-
- /**
- 目标:Collection集合的遍历方式。
- 什么是遍历? 为什么开发中要遍历?
- 遍历就是一个一个的把容器中的元素访问一遍。
- 开发中经常要统计元素的总和,找最值,找出某个数据然后干掉等等业务都需要遍历。
- Collection集合的遍历方式是全部集合都可以直接使用的,所以我们学习它。
- Collection集合的遍历方式有三种:
- (1)迭代器。
- (2)foreach(增强for循环)。
- (3)JDK 1.8开始之后的新技术Lambda表达式(了解)
- a.迭代器遍历集合。
- -- 方法:
- public Iterator iterator(): 获取集合对应的迭代器,用来遍历集合中的元素的
- boolean hasNext():判断是否有下一个元素,有返回true ,反之。
- E next():获取下一个元素值!
- --流程:
- 1.先获取当前集合的迭代器
- Iterator<String> it = lists.iterator();
- 2.定义一个while循环,问一次取一次。
- 通过it.hasNext()询问是否有下一个元素,有就通过
- it.next()取出下一个元素。
- 小结:
- 记住代码。
- */
- public class CollectionDemo01 {
- public static void main(String[] args) {
- ArrayList<String> lists = new ArrayList<>();
- lists.add("赵敏");
- lists.add("小昭");
- lists.add("素素");
- lists.add("灭绝");
- System.out.println(lists);
- // [赵敏, 小昭, 素素, 灭绝]
- // it
-
- // 1、得到当前集合的迭代器对象。
- Iterator<String> it = lists.iterator();
- // String ele = it.next();
- // System.out.println(ele);
- // System.out.println(it.next());
- // System.out.println(it.next());
- // System.out.println(it.next());
- // System.out.println(it.next()); // NoSuchElementException 出现无此元素异常的错误
-
- // 2、定义while循环
- while (it.hasNext()){
- String ele = it.next();
- System.out.println(ele);
- }
- System.out.println("-----------------------------");
-
- }
- }
迭代器执行流程
总结:
1.迭代器的默认位置在哪里。
Iterator<E> iterator():得到迭代器对象,默认指向当前集合的索引0。
2.迭代器如果取元素越界会出现什么问题。
会出现NoSuchElementException异常。
增强for循环:既可以遍历集合也可以遍历数组。
- import java.util.ArrayList;
- import java.util.Arrays;
- import java.util.Collection;
- public class CollectionDemo02 {
- public static void main(String[] args) {
- Collection<String> lists = new ArrayList<>();
- lists.add("赵敏");
- lists.add("小昭");
- lists.add("殷素素");
- lists.add("周芷若");
- System.out.println(lists);
- // [赵敏, 小昭, 殷素素, 周芷若]
- // ele
-
- for (String ele : lists) {
- System.out.println(ele);
- }
-
- System.out.println("------------------");
- double[] scores = {100, 99.5 , 59.5};
- for (double score : scores) {
- System.out.println(score);
- // if(score == 59.5){
- // score = 100.0; // 修改无意义,不会影响数组的元素值。
- // }
- }
- System.out.println(Arrays.toString(scores));
-
- }
- }
Lambda表达式遍历集合
得益于JDK 8开始的新技术Lambda表达式,提供了一种更简单、更直接的遍历集合的方式。
Collection结合Lambda遍历的API
- import java.util.ArrayList;
- import java.util.Collection;
- import java.util.function.Consumer;
- public class CollectionDemo03 {
- public static void main(String[] args) {
- Collection<String> lists = new ArrayList<>();
- lists.add("赵敏");
- lists.add("小昭");
- lists.add("殷素素");
- lists.add("周芷若");
- System.out.println(lists);
- // [赵敏, 小昭, 殷素素, 周芷若]
- // s
- lists.forEach(new Consumer<String>() {
- @Override
- public void accept(String s) {
- System.out.println(s);
- }
- });
-
- // lists.forEach(s -> {
- // System.out.println(s);
- // });
-
- // lists.forEach(s -> System.out.println(s) );
-
- lists.forEach(System.out::println );
-
- }
- }
案例:影片信息在程序中的表示
需求:某影院系统需要在后台存储上述三部电影,然后依次展示出来。
分析:
1.定义一个电影类,定义一个集合存储电影对象。
2.创建3个电影对象,封装相关数据,把3个对象存入到集合中去。
3.遍历集合中的3个对象,输出相关信息。
- public class Movie {
- private String name;
- private double score;
- private String actor;
-
- public Movie() {
- }
-
- public Movie(String name, double score, String actor) {
- this.name = name;
- this.score = score;
- this.actor = actor;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public double getScore() {
- return score;
- }
-
- public void setScore(double score) {
- this.score = score;
- }
-
- public String getActor() {
- return actor;
- }
-
- public void setActor(String actor) {
- this.actor = actor;
- }
-
- @Override
- public String toString() {
- return "Movie{" +
- "name='" + name + '\'' +
- ", score=" + score +
- ", actor='" + actor + '\'' +
- '}';
- }
- }
- import java.util.ArrayList;
- import java.util.Collection;
-
- public class TestDemo {
- public static void main(String[] args) {
- // 1、定义一个电影类
- // 2、定义一个集合对象存储3部电影对象
- Collection<Movie> movies = new ArrayList<Object>();
- movies.add(new Movie("《你好,李焕英》", 9.5, "张小斐,贾玲,沈腾,陈赫"));
- movies.add(new Movie("《唐人街探案》", 8.5, "王宝强,刘昊然,美女"));
- movies.add(new Movie("《刺杀小说家》",8.6, "雷佳音,杨幂"));
-
- System.out.println(movies);
-
- // 3、遍历集合容器中的每个电影对象
- for (Movie movie : movies) {
- System.out.println("片名:" + movie.getName());
- System.out.println("得分:" + movie.getScore());
- System.out.println("主演:" + movie.getActor());
- }
-
- }
- }
集合中存储的是元素对象的地址。