程序员scholar 程序员scholar
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • Vue3 + TS
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • Vue3 + TS
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
npm

(进入注册为作者充电)

  • 数据结构

    • 时间复杂度
    • 初识集合
      • List接口
      • Set接口
      • Queue接口
      • Map接口
      • Collections工具类
      • 模拟实现ArrayList
      • 单向链表的实现
      • 双向链表的实现
      • 树和二叉树的实现
      • 二叉搜索树的实现
    • Java数据结构
    • 数据结构
    scholar
    2024-03-21
    目录

    初识集合

    # 一、初识集合

    image-20240101230616685

    # (1)集合是什么?为什么要用集合?

    保存数据会经常使用到数组,但数组存在以下几个缺陷:

    1. 长度开始时必须指定,且一旦指定,不能更改;
    2. 保存的必须为同一类型的元素;
    3. 使用数组进行增加元素的步骤比较麻烦;
    // 使用数组
    Item[] items = new Item[1]; // 创建一个初始大小为1的数组
    items[0] = new Item(); // 在数组中添加一个元素
    
    // 扩展数组大小
    Item[] moreItems = new Item[items.length + 1]; // 创建一个更大的数组以容纳更多元素
    System.arraycopy(items, 0, moreItems, 0, items.length); // 将原数组内容复制到新数组中
    moreItems[items.length] = new Item(); // 在新数组中添加另一个元素
    
    1
    2
    3
    4
    5
    6
    7
    8

    这个时候就需要用一个比数组要“高级的容器”来解决,这就是集合:

    1. 可以动态保存任意多个不同类型对象,使用方便;
    2. 提供了一系列方便的操作对象的方法:add、remove、set、get等;
    3. 使用集合添加、删除新元素要简单的多;
    // 使用集合 (集合还提供了泛型支持,可以在编译时检查类型)
    List<Item> itemList = new ArrayList<>(); // 创建一个集合
    itemList.add(new Item()); // 直接在集合中添加一个元素
    itemList.add(new Item()); // 再添加一个元素。集合会自动扩展以容纳更多元素,无需像数组那样手动管理大小
    
    1
    2
    3
    4

    # (2)集合的框架体系

    Java的集合类有很多,主要分为两大类:

    单列集合:在这里插入图片描述 双列集合:在这里插入图片描述

    //单列集合
    ArrayList arrayList = new ArrayList();
    arrayList.add("Jack");
    arrayList.add("Tom");
    
    //双列集合
    HashMap hashMap = new HashMap();
    hashMap.put("No.1","我");
    hashMap.put("No.2","你");
    
    1
    2
    3
    4
    5
    6
    7
    8
    9

    # 二、Collection接口

    Collection接口实现类的特点:

    public interface Collection<E> extends Iterable<E>
    
    1
    1. Collection实现子类可以存放多个元素,每个元素可以是Object
    2. 有些Collection的实现类,可以存放重复的元素,有些不可以;
    3. 有些Collection的实现类,有些是有序的(List),有些则不是有序(Set);
    4. Collection接口没有直接的实现子类,是通过它的子接口List和Set来实现的;

    # (1)Collection接口常用方法

    下面这些方法是 List 和 Set 都有的

    方法 描述
    size() 返回集合中的元素数量
    clear() 清空集合中的所有元素
    isEmpty() 检查集合是否为空
    add(Object e) 添加单个元素 e
    remove(Object o) 删除指定元素 o
    contains(Object o) 检查是否包含元素 o
    addAll(Collection c) 添加集合 c 中的所有元素
    containsAll(Collection c) 检查集合中是否包含集合 c 的所有元素
    removeAll(Collection c) 删除集合中包含在集合 c 中的所有元素

    以 ArrayList 实现类来演示:

    import java.util.ArrayList;
    import java.util.List;
    
    public class CollectionMethod {
        public static void main(String[] args) {
            //1.add:添加单个元素
            List list = new ArrayList();
            list.add("字符串");
            list.add(128);//list.add(new Integer(10))
            list.add(true);
            System.out.println("list="+list);//list=[字符串, 128, true]
    
            //2.remove:删除指定元素
            //list.remove(0);//删除第一个元素
            //System.out.println("list="+list);//list=[128, true]
            list.remove("字符串");//指定删除某个元素
            System.out.println("list="+list);//list=[128, true]
    
            //3.contains:查找某个元素是否存在
            System.out.println(list.contains(128));//true
    
            //4.size:返回元素个数
            System.out.println(list.size());//2
    
            //5.isEmpty:判断是否为空
            System.out.println(list.isEmpty());//false
    
            //6.clear:清空
            list.clear();
            System.out.println("list= "+list);//list= []
    
            //7.addAll:添加多个元素
            ArrayList list2 = new ArrayList();
            list2.add("开心");
            list2.add("每");
            list2.add(1);
            list2.add("天");
            list.addAll(list2);//传入一个集合
            System.out.println("新的list:"+list);//新的list:[开心, 每, 1, 天]
    
            //8.containsAll:查找多个元素是否存在
            System.out.println(list.containsAll(list2));//true
    
            //9.removeAll:删除多个元素
            list.removeAll(list2);
            System.out.println("list="+list);//list=[]
        }
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48

    # (2)Iterator(迭代器)遍历元素

    1. Iterator对象(迭代器):主要用于遍历 Collection 集合中的元素。迭代器提供了一种统一的方法来访问集合中的每个元素,而不需要知道集合的内部结构。
    2. 集合类和Iterable接口:所有的集合类都实现了 Iterable 接口,这就是为什么它们都可以使用 Iterator 迭代器进行遍历。这包括 List, Set, Queue 等集合类型。
    3. iterator() 方法:实现了 Iterable 接口的集合类必须提供 iterator() 方法。该方法返回一个实现了 Iterator 接口的对象,即迭代器。通过迭代器,我们可以遍历集合中的元素。
    4. Iterator的作用:Iterator 仅用于遍历集合,它本身并不存储对象。迭代器提供了几个核心方法,如 next() 来获取下一个元素,hasNext() 来检查是否还有更多元素,以及 remove() 方法来从集合中移除元素。
    迭代器执行原理:
    Iterator iterator = new coll.iterator(); 得到一个集合迭代器
    hasNext() :判断是否还有下一个元素
    while(iterator.hasNext()){
    	next()作用:返回当前指针指向的元素,并将指针移动到下一个元素的位置
    	System.out.println(iterator.next());
    }
    
    1
    2
    3
    4
    5
    6
    7

    Iterator的next()方法返回的是Object,每 next() 一次,箭头下移一次: image-20240101231057832

    注意:在调用 iterator.next( ) 方法之前,必须要调用iterator.hasNext( ) 进行检测;若不调用,且下一条记录无效,直接调用 iterator.next( ) 会抛出 NoSuchElementException异常。

    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.Iterator;
    
    public class CollectionIterator {
        public static void main(String[] args) {
            // 创建 Collection 集合并添加字符串元素
            Collection<String> col = new ArrayList<>();
            col.add("三国演义");
            col.add("红楼梦");
            col.add("西游记");
    
    	// 先得到col集合对应的迭代器
    	Iterator<String> iterator = col.iterator();
    
            // 使用迭代器遍历集合
            // 快捷键:输入 "itit" 后按回车快速生成 while 循环
            // Ctrl+J 可查看当前所有快捷键
            while (iterator.hasNext()) { // 判断是否还有数据
                String book = iterator.next();
                System.out.println(book);
            }
    
            // 注意:当退出 while 循环后,迭代器指向最后的元素
            // 再次调用 iterator.next() 将引发 NoSuchElementException
            // 若要重新使用迭代器,需要重新获取迭代器
            iterator = col.iterator();
        }
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29

    # (3)增强 for 循环遍历元素

    • 增强for循环,可以代替 iterator迭代器,底层实际上是使用 Iterator 来实现的
    • 特点:增强for循环就是简化版的iterator,本质一样,只能用于遍历集合或数组;
    • 1704113032475
    import java.util.ArrayList;
    import java.util.Collection;
    
    public class CollectionIterator {
        public static void main(String[] args) {
            Collection<String> books = new ArrayList<>();
    
            // 添加书籍信息
            books.add("三国演义 - 罗贯中 - 10.1");
            books.add("红楼梦 - 曹雪芹 - 34.6");
            books.add("西游记 - 吴承恩 - 28.8");
    
            // 使用增强for循环遍历集合
            for (String book : books) {
                System.out.println(book);
            }
        }
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    编辑此页 (opens new window)
    上次更新: 2024/12/28, 18:32:08
    时间复杂度
    List接口

    ← 时间复杂度 List接口→

    Theme by Vdoing | Copyright © 2019-2025 程序员scholar
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式