小白备战蓝桥杯:Java集合与数据结构

news2025/2/5 18:01:01

目录

什么是集合?

集合的分类

<> : 泛型

浅谈泛型

 代码示例

细说泛型

泛型类

泛型方法

泛型接口

泛型通配符

Collection接口

集合的通用遍历方式

1、迭代器遍历

2、增强for循环

3、forEach方法

4、代码示例

List接口

方法

List集合的遍历方式

并发修改异常 : ConcurrentModificationException

数据结构——顺序表:ArrayList

构造方法

ArrayList 常用成员方法

代码示例

数据结构——双向链表:LinkedList

数据结构——红黑树:TreeSet

红黑规则

添加结点规则

数据结构——哈希表:HashSet


什么是集合?

集合是一种容器,长度可变

集合的分类

List集合:存取有序、有索引、可以存取重复的

Set集合:存取无序、无索引、不能存取重复的

<> : 泛型

浅谈泛型

泛型可以对集合中数据的数据类型进行约束

例如:ArrayList<String> list = new ArrayList<String>();

在JDK7版本之后,后面的尖括号中的内容可直接省略,直接写成ArrayList<String> list = new ArrayList<>();

目前: 使用泛型, 可以对集合中存储的数据, 进行类型限制

细节: 泛型中, 不允许编写基本数据类型

问题: 那我要是想集合中, 存储 整数, 小数, 字符... 这些数据, 怎么办呢?

解决: 使用基本数据类型, 所对应的包装类

                                            byte   ->   Byte

                                            short   ->   Short

                                            int     ->     Integer    (重点记忆)

                                            long     ->    Long

                                            float    ->     Float

                                            double   ->    Double

                                            boolean   ->   Boolean

                                            char     ->    Character  (重点记忆)

 代码示例

public static void main(String[] args) {

        // 步骤1: 创建一个集合容器, 内部存储 11.1 22.2 33.3

        ArrayList<Double> list1 = new ArrayList<>();

        list1.add(11.1);

        list1.add(22.2);

        list1.add(33.3);

        // 步骤2: 创建一个集合容器, 内部存储 张三, 李四, 王五

        ArrayList<String> list2 = new ArrayList<>();

        list2.add("张三");

        list2.add("李四");

        list2.add("王五");

        // 步骤3: 在控制台展示两个集合中的元素

        System.out.println(list1);

        System.out.println(list2);

    }

细说泛型

泛型类

泛型方法

泛型接口

泛型通配符

Collection接口

// 以多态的形式创建集合对象, 调用单列集合中的共有方法
//左边接口名,右边实现类对象
        Collection<String> c = new ArrayList<>();

        c.add("张三");
        c.add("李四");
        c.add("王五");

        boolean b = c.contains("赵四");
        System.out.println(b);

        System.out.println(c.size());

集合的通用遍历方式

List集合的遍历方式:

但这种方法不适用于Set集合,因为Set集合没有索引,所以下面介绍几种集合的通用遍历方法

1、迭代器遍历

public Iterator<E> iterator() : 获取遍历集合的迭代器

public E next() : 从集合中获取一个元素

public boolean hasNext() : 如果仍有元素可以迭代,则返回 true

迭代器遍历三部曲

2、增强for循环

简化迭代器的书写,底层逻辑也是迭代器

其实我觉得增强for循环有点像vue中的v-for,v-for="(item,index) in arr",其中的item就相当于上述例子中的s,而arr相当于上述例子中的list

3、forEach方法

4、代码示例

Collection<Student> c = new ArrayList<>();

        c.add(new Student("张三", 23));
        c.add(new Student("李四", 24));
        c.add(new Student("王五", 25));


        // 1. 获取迭代器
        Iterator<Student> it = c.iterator();

        // 2. 循环判断, 集合中是否还有元素
        while (it.hasNext()) {
            // 3. 调用next方法, 将元素取出
            Student stu = it.next();
            System.out.println(stu.getName() + "---" + stu.getAge());
        }

        System.out.println("--------------------");

        // 使用增强for循环遍历集合
        //idea增强for循环快捷键c.for+enter
        for (Student stu : c) {
            System.out.println(stu);
        }

        System.out.println("--------------------");

        // foreach方法遍历集合
        c.forEach(stu -> System.out.println(stu));

List接口

List接口的特点 : 存取有序, 有索引, 可以存储重复的

方法

List<String> list = new ArrayList<>();

        list.add("张三");
        list.add("李四");
        list.add("王五");

        list.set(0, "赵六");
        list.remove(1);

        System.out.println(list.get(0));

        System.out.println(list);

        System.out.println("-------------------------");

        List<Integer> list2 = new ArrayList<>();

        list2.add(111);        // Integer e = 111;
        list2.add(222);
        list2.add(333);

        list2.remove(Integer.valueOf(222)); //若希望根据元素删除而不是根据索引删除,则需要Integer.valueOf

        System.out.println(list2);

List集合的遍历方式

通用遍历方式:

1. 迭代器遍历

2. 增强for循环

3. foreach方法       

List集合特有的遍历方式:

1. 普通for循环

2. ListIterator (List集合特有的迭代器)

List<String> list = new ArrayList<>();
        list.add("abc");
        list.add("bbb");
        list.add("ccc");
        list.add("abc");

        for (int i = 0; i < list.size(); i++) { //普通for循环
            String s = list.get(i);
            System.out.println(s);
        }

        System.out.println("---------------");

        ListIterator<String> it = list.listIterator();

        while(it.hasPrevious()){ //逆序遍历
            String s = it.previous();
            System.out.println(s);
        }

        System.out.println("---------------");

        while (it.hasNext()) { //顺序遍历
            String s = it.next();
            System.out.println(s);
        }

并发修改异常 : ConcurrentModificationException

场景: 使用[迭代器]遍历集合的过程中, 调用了[集合对象]的添加, 删除方法, 就会出现此异常

解决方案: 迭代器的遍历过程中, 不允许使用集合对象的添加或删除, 那就使用迭代器自己的添加或删除方法。普通的迭代器有删除方法,普通迭代器没有添加方法, 需要使用List集合特有的迭代器的添加方法

List<String> list = new ArrayList<>();

        list.add("眼瞅着你不是真正的高兴");
        list.add("温油");
        list.add("离开俺们这旮表面");
        list.add("伤心的人别扭秧歌");
        list.add("私奔到东北");

        ListIterator<String> it = list.listIterator();
        while (it.hasNext()) {
            String s = it.next();
            if ("温油".equals(s)) {
                it.add("哈哈");
            }
        }
        System.out.println(list);

数据结构——顺序表:ArrayList

当数组元素满了之后,会自动扩容为1.5倍

细节: 创建String, StringBuilder, ArrayList类的对象, 打印对象名, 都没有看到地址值, 而是元素内容

构造方法

                    public ArrayList() : 创建一个空的集合容器

ArrayList 常用成员方法

其中有一些方法是List接口提供的

代码示例

 public static void main(String[] args) {

        ArrayList<String> list = new ArrayList<>();

        list.add("张三1");

        list.add("张三2");

        list.add("张三3");

        String s = list.get(2);

        System.out.println(s);

        System.out.println(list.size());

    }

    private static void updateMethod() {

        ArrayList<String> list = new ArrayList<>();

        list.add("张三1");

        list.add("张三2");

        list.add("张三3");

        String result = list.set(1, "李四");

        System.out.println(result);

        System.out.println(list);

    }

    private static void removeMethod() {

        ArrayList<String> list = new ArrayList<>();

        list.add("张三1");

        list.add("张三2");

        list.add("张三3");

        System.out.println(list);

        boolean flag = list.remove("李四");

        System.out.println(flag);

        System.out.println(list);

    }

    private static void addMethod() {

        ArrayList<String> list = new ArrayList<>();

        list.add("张三1");

        list.add("张三2");

        list.add("张三3");

        list.add(0, "张三4");

        System.out.println(list);

    }

数据结构——双向链表:LinkedList

public static void main(String[] args) {

        LinkedList<String> list = new LinkedList<>();

        list.add("张三");
        list.add("李四");
        list.add("王五");

        String s = list.get(1);
        System.out.println(s);

    }

    private static void method2() {
        LinkedList<String> list = new LinkedList<>();

        list.add("张三");
        list.add("李四");
        list.add("王五");
        list.add("赵六");

        System.out.println(list.getFirst());
        System.out.println(list.getLast());

        list.removeFirst();
        list.removeLast();

        System.out.println(list);
    }

    private static void method1() {
        LinkedList<String> list = new LinkedList<>();

        list.addFirst("张三");
        list.addFirst("李四");
        list.addFirst("王五");
        list.addLast("赵六");

        // 王五 李四 张三 赵六

        System.out.println(list);
    }

数据结构——红黑树:TreeSet

学习TreeSet之前,大家需要先理解一些概念:树、二叉树、二叉查找树(二叉搜索树)、平衡二叉树、左(右)旋,对于这些概念,大家可以去网上搜索数据结构的动画演示,结合动画很快就能理解

接下来咱们详细说说红黑树,作者在学平衡二叉树的时候觉得还蛮简单的,但是学到红黑树的时候,被红黑树添加结点的规则给绕晕了,所以在这里有必要记录一下红黑规则和红黑树添加结点的规则

红黑规则

红黑树是一种自平衡的二叉查找树

添加结点规则

TreeSet集合特点:排序、去重,代码示例:

 

数据结构——哈希表:HashSet

未完待续

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1336982.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构初阶】二叉树(2)

二叉树顺序结构 1.二叉树的顺序结构及实现1.1二叉树的顺序结构 1.2 堆的概念及结构1.3 堆的实现1.3.1向上调整1.3.2向下调整1.3.3交换函数1.3.4打印1.3.5初始化1.3.6销毁1.3.7插入1.3.8删除1.3.9获得堆顶元素1.3.10判断是否为空1.3.6 堆的代码实现 1.3.2堆的创建1.3.3 建堆时间…

迪文屏开发保姆级教程5—表盘时钟和文本RTC显示

这篇文章要讲啥事呢&#xff1f; 本篇文章主要介绍了在DGBUS平台上使用表盘时钟和文本时钟RTC显示功能的方法。 文哥悄悄话&#xff1a; 官方开发指南PDF&#xff1a;&#xff08;不方便下载的私聊我发给你&#xff09; https://download.csdn.net/download/qq_21370051/8864…

一文了解什么是微信小程序

如果您无需下载和管理即可获得像原生 iOS 或 Android APP 一样流畅的体验会怎样&#xff1f;腾讯通过微信小程序实现了这一替代方案。 一、什么是微信小程序&#xff1f;它们与原生应用程序和 H5 迷你网站相比如何 什么是微信小程序&#xff1f; 小程序是微信平台内构建的“…

Stage 模型

1. 基本概念 FA模型&#xff1a;HarmonyOS早期版本开始支持的模型&#xff0c;已经不再推荐。Stage模型&#xff1a;HarmonyOS 3.1版本开始新增的模型&#xff0c;目前主推并且会长期演进的模型。 Stage模型结构&#xff1a; 2. 应用及组件配置 2.1 工程级目录 AppScope 中…

Zookeeper应用场景有哪些?

ZooKeeper是⼀个典型的发布/订阅模式的分布式数据管理与协调框架&#xff0c;我们可以使⽤它来进⾏分布式数据的发布与订阅。另⼀⽅⾯&#xff0c;通过对ZooKeeper中丰富的数据节点类型进⾏交叉使⽤&#xff0c;配合Watcher事件通知机制&#xff0c;可以⾮常⽅便地构建⼀系列分…

Dockerfile构建镜像

Dockerfile构建镜像 Dockerfile 是一个文本格式的配置文件&#xff0c; 用户可以使用 Dockerfile 来快速创建自定义的镜像&#xff0c;另外&#xff0c;使 用Dockerfile去构建镜像好比使用pom去构建maven项目一样&#xff0c;有异曲同工之妙 基本结构 Dockerfile 由一行行…

【JavaWeb学习笔记】16 - JSon和Ajax

项目代码 https://github.com/yinhai1114/JavaWeb_LearningCode/tree/main/json https://github.com/yinhai1114/JavaWeb_LearningCode/tree/main/ajax 目录 〇、官方文档 一、JSon 1.JSon介绍 2.JSon快速入门 3.JSON对象和字符串对象转换 1.应用案例 2.注意事项和细节 …

【基础篇】二、字节码文件的组成 Arthas + jclasslib +javap

文章目录 1、jclasslib工具2、基础信息部分3、常量池部分4、方法部分&#xff08;从字节码指令看i&#xff09;5、三种1操作的性能对比6、javap -v命令7、jclasslib插件8、Arthas 1、jclasslib工具 字节码文件中保存的是源代码编译后的内容&#xff0c;以二进制方式存储&#…

面试题:Zabbix 和 Prometheus 到底怎么选?

文章目录 前言历史简介PrometheusZabbix 架构对比PrometheusZabbix 综合对比总结 前言 新公司要上监控&#xff0c;面试提到了 Prometheus 是公司需要的监控解决方案&#xff0c;我当然是选择跟风了。 之前主要做的是 Zabbix&#xff0c;既然公司需要 Prometheus&#xff0c;…

一个可以统计网页各个国家的浏览量的小工具

flag-counter 为网站添加【展示国家地区旗帜】FlagCounter访客统计 – 天祺围棋 很神奇 它是咋记录这个数据滴呢

el-date-picker中可能会遇到下拉选项框偏移

一般情况我们的下拉选项框偏移造成这种情况的就是我们同一个html页面中出现不同形式的下拉时间选择 当我们出现这种情况的时候只需要在我们这个html的日期时间选择器上加上不同的key值就可以了 这样就互不干扰

java.lang.EnumConstantNotPresentException

枚举常量不存在异常。当应用试图通过名称和枚举类型访问一个枚举对象&#xff0c;但该枚举对象并不包含常量时&#xff0c;抛出该异常 1.遇到的问题是我删除了带有CustomAnnotation注解的类,启动服务器还是会抛出异常 2.首先全局搜索了相关的枚举名字 确认没有引用。后发现项目…

使用netty做硬件测试代码的一般步骤

准备工作&#xff1a;搭建netty 1、util文件中准备好数据结构转换&#xff0c;byte[]数组转为int类型 大端写法&#xff0c;从高往低位读 public static int bytesToInt(byte[] bytes){int value;value ((bytes[0] & 0xff)<<24)|((bytes[1] & 0xff)<<16…

Plantuml之序列图语法介绍(十七)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

arcpy工具箱根据个别参数隐藏/显示其他参数

引入 工具箱属性中有验证参数&#xff08;如下图&#xff09;&#xff0c;该部分主要用于工具箱参数是否符合我们的要求&#xff0c;主要包含3方面的函数&#xff0c;分别是在打开工具箱调用的initializeParameters()、修改参数值后调用updateParameters()、为参数设置消息提示…

DevC++ easyx实现悬浮窗放入网格,与在函数分离过程中遇到的BUG下理解 函数的作用时域 以及 初始化与复位的关系。

这次就着上上上篇的悬浮窗代码DevC easyx实现图片拖动&#xff0c;一种悬浮窗实现原理与完整代码-CSDN博客 继续实现效果。 基本背景是搓出来图片拖动了&#xff0c;然后想把图片暂存到另一块。再细说背景的背景就是之前提到Unity复刻瓦片地图&#xff0c;想着整合一个铅笔绘…

web前端 JQuery下拉菜单的案例

浏览器运行结果&#xff1a; JQuery下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/17LXZigLQ8yau0toTGj4P_Q?pwd4332 提取码&#xff1a;4332 代码&#xff1a; <!doctype html> <html> <head> <meta charset"UTF-8"><…

Emu2:37亿参数开创多模态生成新篇章

引言 多模态任务在人工智能领域一直是极具挑战性的「技术高地」。智源研究院最近开源发布的新一代多模态基础模型Emu2&#xff0c;在这一领域取得了突破性进展。Emu2以其庞大的37亿参数规模和强大的多模态生成能力&#xff0c;为AI的多模态理解和生成开启了新的篇章。 模型概…

【重点!!!】【贪心】45.跳跃游戏II

题目 法1&#xff1a;贪心 贪心是最优解法&#xff0c;必须掌握&#xff01;重点理解&#xff0c;看B站视频辅助&#xff01;&#xff01;&#xff01; 在具体的实现中&#xff0c;我们维护当前能够到达的最大下标位置&#xff0c;记为边界。我们从左到右遍历数组&#xff0…

记账导出excel表格,用表格导出账目数据

我们每天都在跟金钱打交道,记账则是更好地管理自己财务的一种方式&#xff0c;传统记账不仅繁琐&#xff0c;还容易出错。那么&#xff0c;有没有简单、高效的记账方式呢&#xff1f;答案是肯定的&#xff01;今天&#xff0c;我们就向大家推荐一款全新的记账软件——晨曦记账本…