Java02-迭代器,数据结构,List,Set ,TreeSet集合,Collections工具类

目录

什么是遍历?

一、Collection集合的遍历方式

1.迭代器遍历

方法

流程

案例

2. foreach(增强for循环)遍历

案例

3.Lamdba表达式遍历

案例

二、数据结构

数据结构介绍

常见数据结构

栈(Stack)

队列(Queue)

链表(Link)

散列表(Hash Table)

树(Tree)

List接口

ArraysList集合

LinkedList集合 

Set接口 

HaseSet集合

LinkedHaseSet集合

TreeSet集合

工具类

Collecations集合工具类

补充

可变参数


什么是遍历?

        遍历就是一个一个的把容器中的元素访问一遍

一、Collection集合的遍历方式

Collection集合的遍历方式有三种:

  1. 迭代器
  2. foreach(增强for循环)
  3. JDK 1.8开始之后的新技术 Lambda表达式

1.迭代器遍历

方法

public Iterator iterator(): 获取集合对应的迭代器,用来遍历集合中的元素

E next():获取下一个元素值!

boolean hasNext():判断是否有下一个元素,有返回true ;反之,则返回false

流程

1.先获取当前集合的迭代器,迭代器需要写泛型,指定类型

              Iterator<E> it = lists.iterator();

2.定义一个while循环,问一次取一次

   通过it.hasNext()询问是否有下一个元素,有就通过

              it.next()取出下一个元素 

        出现异常NoSuchElementException,出现没有此元素异常!

案例

public class CollectionDemo01 {
    public static void main(String[] args) {
        Collection<String> lists = new ArrayList<>();
        lists.add("张三");
        lists.add("李四");
        lists.add("王五");
        lists.add("赵六");
        System.out.println(lists);
        // lists = [张三, 李四, 王五, 赵六]

        // 1.得到集合的迭代器对象。
        Iterator<String> it = lists.iterator();

        // 2.使用while循环遍历。
        while(it.hasNext()){
            String ele = it.next();
            System.out.println(ele);
        }

    }
}
[张三, 李四, 王五, 赵六]
张三
李四
王五
赵六

2. foreach(增强for循环)遍历

        foreach可以遍历集合或者数组

缺点:foreach遍历无法知道遍历到了哪个元素了,因为没有索引

案例

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);
        // lists = [张三, 李四, 王五, 赵六]
        //  ele
        for (String ele : lists) {
            System.out.println(ele);
        }
    }
}
[张三, 李四, 王五, 赵六]
张三
李四
王五
赵六

3.Lamdba表达式遍历

        JDK 1.8开始之后的新技术Lambda表达式,调用foeEach

案例

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);
        // lists = [张三, 李四, 王五, 赵六]
        //  ele
        lists.forEach(s -> {
            System.out.println(s);
        });
        
//        lists.forEach(s -> System.out.println(s));
//
//        lists.forEach(System.out::println);
    }
}

二、数据结构

数据结构介绍

数据结构:数据是以什么方式组合在一起的

数据结构不仅要存储元素,还要提供对元素进行增删改查的操作

常见数据结构

常见的数据结构:栈、队列、链表、散列表、树

栈(Stack)

        栈(stack)是限制插入和删除只能在一个位置上进行的表,该位置是表的末端,叫做栈顶 (top)。它是后进先出(LIFO)的。对栈的基本操作只有 push(进栈)和 pop(出栈)两种,前者相当于插入,后者相当于删除最后的元素

队列(Queue)

        队列是一种特殊的线性表 ,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头

链表(Link)

1

散列表(Hash Table)

         散列表算法希望能尽量做到不经过任何比较,通过一次存取就能得到所查找的数据元素
构造散列函数的方法有:

        直接定址法: 取关键字或关键字的某个线性函数值为散列地址。

                即:h(key) = key 或 h(key) = a * key + b,其中 a 和 b 为常数。

        数字分析法

        平方取值法: 取关键字平方后的中间几位为散列地址。

        折叠法:将关键字分割成位数相同的几部分,然后取这几部分的叠加和作为散列地址。

        

        除留余数法:取关键字被某个不大于散列表表长 m 的数 p 除后所得的余数为散列地址, 即:h(key) = key MOD p p ≤ m

        随机数法:选择一个随机函数,取关键字的随机函数值为它的散列地址,

即:h(key) = random(key)

树(Tree)

树具有的特点:

  1. 每一个节点有零个或者多个子节点

  2. 没有父节点的节点称之为根节点,一个树最多有一个根节点。

  3. 每一个非根节点有且只有一个父节点

名词含义
节点指树中的一个元素
节点的度节点拥有的子树的个数,二叉树的度不大于2
叶子节点度为0的节点,也称之为终端结点
高度叶子结点的高度为1,叶子结点的父节点高度为2,以此类推,根节点的高度最高
根节点在第一层,以此类推
父节点若一个节点含有子节点,则这个节点称之为其子节点的父节点
子节点子节点是父节点的下一层节点
兄弟节点拥有共同父节点的节点互称为兄弟节点

树基本结构介绍

树的进阶

注意事项:

        除了java.util.PriorityQueue没有实现Cloneable接口外,Java合集框架中的其他类所有类都实现了java.util.Cloneable和java.util.Serializable接口

        所以,除了优先队列,其他合集都可以克隆和实例化

左边高,向右旋

如果右旋,无法满足条件的话,放弃右旋,用左旋

List接口

        List系列集合:添加的元素,是有序,可重复,有索引的

  • LinkedList: 添加的元素,是有序,可重复,有索引的

  • ArrayList: 添加的元素,是有序,可重复,有索引的

  • Vector 是线程安全的,速度慢,工作中很少使用

List接口中常用方法

  • public void add(int index, E element): 将指定的元素,添加到该集合中的指定位置上。

  • public E get(int index):返回集合中指定位置的元素。

  • public E remove(int index): 移除列表中指定位置的元素, 返回的是被移除的元素。

  • public E set(int index, E element):用指定元素替换集合中指定位置的元素,返回值的更新前的元素

ArraysList集合

        ArrayList实现类集合底层基于数组存储数据的,查询快,增删慢

  • public void add(int index, E element): 将指定的元素,添加到该集合中的指定位置上

  • public E get(int index):返回集合中指定位置的元素

  • public E remove(int index): 移除列表中指定位置的元素, 返回的是被移除的元素

  • public E set(int index, E element):用指定元素替换集合中指定位置的元素,返回更新前的元素值

底层

特点:元素增删慢,查找快

LinkedList集合 

        LinkedList是支持双链表,定位前后的元素是非常快的,增删首尾的元素也是最快的。
提供了很多操作首尾元素的特殊API可以做栈和队列的实现

是一个双向链表

底层

特点:

方法:

  • public void addFirst(E e):将指定元素插入此列表的开头。

  • public void addLast(E e):将指定元素添加到此列表的结尾。

  • public E getFirst():返回此列表的第一个元素。

  • public E getLast():返回此列表的最后一个元素。

  • public E removeFirst():移除并返回此列表的第一个元素。

  • public E removeLast():移除并返回此列表的最后一个元素。

  • public E pop():从此列表所表示的堆栈处弹出一个元素。

  • public void push(E e):将元素推入此列表所表示的堆栈。

  • public boolean isEmpty():如果列表不包含元素,则返回true

Set接口 

介绍

        Set是一个用于存储和处理无重复元素的高效数据结构

特点

        没有重复元素,没有提过索引遍历

可以使用HaseSet、LinkedHashSet、TreeSet类

研究两个问题(面试热点):
1)Set集合添加的元素是不重复的,是如何去重复的?
2)Set集合元素无序的原因是什么?

HaseSet集合

HashSet:添加的元素,是无序,不重复,无索引的

底层

LinkedHaseSet集合

        LinkedHashSet底层依然是使用哈希表存储元素的,但是每个元素都额外带一个链来维护添加顺序
        增删查快,而且有序。

        缺点:多了一个存储顺序的链会占内存空间,而且不允许重复,无索引。

TreeSet集合

        TreeSet: 不重复,无索引,按照大小默认升序排序

        TreeSet集合自自排序的方式:

  1. 有值特性的元素直接可以升序排序。(浮点型,整型)
  2. 字符串类型的元素会按照首字符的编号排序。
  3. 对于自定义的引用数据类型,TreeSet默认无法排序,执行的时候直接报错,因为人家不知道排序规则。


        自定义的引用数据类型的排序实现:
对于自定义的引用数据类型,TreeSet默认无法排序
所以我们需要定制排序的大小规则,程序员定义大小规则的方案有2种:
第1种:直接为对象的类实现比较器规则接口Comparable,重写比较方法(拓展方式)
        如果程序员认为比较者大于被比较者 返回正数
        如果程序员认为比较者小于被比较者 返回负数
        如果程序员认为比较者等于被比较者 返回0

第2种:直接为集合设置比较器Comparator对象,重写比较方法
        如果程序员认为比较者大于被比较者 返回正数
        如果程序员认为比较者小于被比较者 返回负数
        如果程序员认为比较者等于被比较者 返回0
注意:如果类和集合都带有比较规则,优先使用集合自带的比较规则

工具类

Collecations集合工具类

        java.utils.Collections:是集合工具类

        Collections并不属于集合,是用来操作集合的工具类。

Collections有几个常用的API:

         public static <T> boolean addAll(Collection<? super T> c, T... elements)

             给集合对象批量添加元素!

         public static void shuffle(List<?> list) :打乱集合顺序。

         public static <T> void sort(List<T> list):将集合中元素按照默认规则排序。

         public static <T> void sort(List<T> list,Comparator<? super T> ):将集合中元素按照指定规则排序。

补充

可变参数

        可变参数用在形参中可以接收多个数据
        可变参数的格式:数据类型... 参数名称

        可变参数的作用

  • 传输参数非常灵活,方便
  • 可以不传输参数
  • 可以传输一个参数
  • 可以传输多个参数
  • 可以传输一个数组

        可变参数在方法内部本质上就是一个数组
        可变参数的注意事项:

  1. 一个形参列表中可变参数只能有一个
  2. 可变参数必须放在形参列表的最后面
public class MethodDemo {
    public static void main(String[] args) {
        sum(); // 可以不传输参数。
        sum(10); // 可以传输一个参数。
        sum(10,20,30); // 可以传输多个参数。
        sum(new int[]{10,30,50,70,90}); // 可以传输一个数组。
    }

    public static void sum(int...nums){
        // 可变参数在方法内部本质上就是一个数组。
        System.out.println("元素个数:"+nums.length);
        System.out.println("元素内容:"+ Arrays.toString(nums));
        System.out.println("--------------------------");
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Hum Brain Mapp:用于功能连接体指纹识别和认知状态解码的高精度机器学习技术

摘要 人脑是一个复杂的网络&#xff0c;由功能和解剖上相互连接的脑区组成。越来越多的研究表明&#xff0c;对脑网络的实证估计可能有助于发现疾病和认知状态的生物标志物。然而&#xff0c;实现这一目标的先决条件是脑网络还必须是个体的可靠标记。在这里&#xff0c;本研究…

物联网|按键实验---学习I/O的输入及中断的编程|读取I/O的输入信号|中断的编程方法|轮询实现按键捕获实验-学习笔记(13)

文章目录 实验目的了解擒键的工作原理及电原理图 STM32F407中如何读取I/O的输入信号STM32F407对中断的编程方法通过轮询实现按键捕获实验如何利用已有内工程创建新工程通过轮询实现按键捕获代码实现及分析1 代码的流程分析2 代码的实现 Tips:下载错误的解决 实验目的 了解擒键…

【数据结构与算法——TypeScript】算法的复杂度分析、 数组和链表的对比

【数据结构与算法——TypeScript】 算法的复杂度分析 什么是算法复杂度(现实案例)&#xff1f; ❤️‍&#x1f525; 前面已经解释了什么是算法&#xff1f; 其实就是解决问题的一系列步骤操作、逻辑。 ✅ 对于同一个问题&#xff0c;我们往往有很多种解决思路和方法&#x…

【百问百答】可靠性基础知识第七期

1.什么是振动频率范围? 振动频率范围表示振动试验由某个频率点到另一个频率点进行往复扫频。 例如&#xff1a;试验频率范围5~500Hz&#xff0c;表示5Hz到500Hz进行往复扫频 2.什么是振动量? 振动量&#xff1a;通常用加速度和位移来表示&#xff1b; 加速度&#xff1a;表…

react学习笔记——1. hello react

包含的包一共有4个&#xff0c;分别的作用如下&#xff1a; babel.min.js&#xff1a;可以进行ES6到ES5的语法转换&#xff1b;可以用于import&#xff1b;可以用于将jsx转换为js。注意&#xff0c;在开发的时候&#xff0c;这个转换&#xff08;jsx转换js&#xff09;不在线上…

webshell详解

Webshell详解 一、 Webshell 介绍二 、 基础常见webshell案例 一、 Webshell 介绍 概念 webshell就是以asp、php、jsp或者cgi等网页文件形式存在的一种命令执行环境&#xff0c;也可以将其称做为一种网页后门。黑客在入侵了一个网站后&#xff0c;通常会将asp或php后门文件与…

vscode如何退出/切换 github 账号

退出/切换 github 账号 左下角点击头像按钮&#xff0c;选择注销&#xff0c;然后再重新登录

计算机视觉:替换万物Inpaint Anything

目录 1 Inpaint Anything介绍 1.1 为什么我们需要Inpaint Anything 1.2 Inpaint Anything工作原理 1.3 Inpaint Anything的功能是什么 1.4 Segment Anything模型&#xff08;SAM&#xff09; 1.5 Inpaint Anything 1.5.1 移除任何物体 1.5.2 填充任意内容 1.5.3 替换任…

react ant add/change created_at

1.引入ant的 Table import { Table, Space, Button, message } from antd; 2.获得接口的数据的时候增加上创建时间 const response await axios.get(${Config.BASE_URL}/api/v1/calculation_plans?token${getToken()});if (response.data.message ok) {const data respon…

Scrum是什么意思,Scrum敏捷项目管理工具有哪些?

一、什么是Scrum&#xff1f; Scrum是一种敏捷项目管理方法&#xff0c;旨在帮助团队高效地开展软件开发和项目管理工作。 Scrum强调迭代和增量开发&#xff0c;通过将项目分解为多个短期的开发周期&#xff08;称为Sprint&#xff09;&#xff0c;团队可以更好地应对需求变…

2023华数杯数学建模C题完整5问代码思路分析

目前已经写出2023华数杯C题母亲身心健康对婴儿成长的影响全部5问的完整代码和42页论文&#xff08;正文30页&#xff0c;论文部分摘要如下&#xff1a; 本文共解决了五个问题&#xff0c;涉及婴儿行为特征、睡眠质量与母亲的身体指标和心理指标的关系&#xff0c;以及如何优化…

STL C++学习背景

STL C学习背景 背景知识 背景知识 STL前置知识 STL&#xff0c;英文全称 standard template library&#xff0c;中文可译为标准模板库或者泛型库&#xff0c;其包含有大量的模板类和模板函数&#xff0c;是 C 提供的一个基础模板的集合&#xff0c;用于完成诸如输入/输出、数…

【Linux】Linux工具

Yan-英杰的主页 悟已往之不谏 知来者之可追 C程序员&#xff0c;2024届电子信息研究生 目录 一、Linux安装软件&#xff1a; 1.yum安装 2.Linux和Windows文件互传 问题: 3.yum卸载软件 二、vim编辑器 1.命令模式 2.vim配置项说明 3.vim操作总结 一、Linux安装软件&#…

DC-4靶机

信息收集 先查看靶机的MAC地址 arp-scan -l 找到目标靶机的IP地址&#xff0c;对其进行扫描 发现开放了80端口和ssh&#xff0c;浏览器访问靶机的80端口&#xff0c;看看有没有可以利用的东西 目录爆破发现也没有什么东西 dirsearch -u http://192.168.80.146 漏洞利用 利用…

LUN映射出错导致写操作不互斥的服务器数据恢复案例

服务器数据恢复环境&#xff1a; 某公司的光纤SAN存储系统&#xff0c;6块硬盘组建一组RAID6&#xff0c;划分若干LUN&#xff0c;MAP到不同的SOLARIS操作系统服务器上。 服务器故障&分析&#xff1a; 由于业务增长需要新增应用&#xff0c;工作人员增加了一台IBM服务器&am…

16-1_Qt 5.9 C++开发指南_多语言界面

文章目录 1. 多语言界面设计概述2. tr()函数的使用3. 生成语言翻译文件4. 使用Qt Linguist 翻译 ts 文件5. 调用翻译文件改变界面语言5.1 生成qm文件5.2 项目启动时设置界面语言5.3 动态切换语言 1. 多语言界面设计概述 有些软件需要开发多语言界面版本&#xff0c;如中文版和…

Cesium 工程模板

1、vue2.x cli https://github.com/948033145/anov-gis-vue2 2、vue3.x vite https://github.com/948033145/anov-gis-vite 下载代码 anov-gis-vue2.x.zip 下载代码 anov-gis-vite.zip

云原生应用里的服务发现

服务定义&#xff1a; 服务定义是声明给定服务如何被消费者/客户端使用的方式。在建立服务之间的同步通信通道之前&#xff0c;它会与消费者共享。 同步通信中的服务定义&#xff1a; 微服务可以将其服务定义发布到服务注册表&#xff08;或由微服务所有者手动发布&#xff09;…

剑指 Offer !!56 - II. 数组中数字出现的次数 II

剑指 Offer 56 - II. 数组中数字出现的次数 II 在一个数组 nums 中除一个数字只出现一次之外&#xff0c;其他数字都出现了三次。请找出那个只出现一次的数字。示例 1&#xff1a;输入&#xff1a;nums [3,4,3,3] 输出&#xff1a;4 示例 2&#xff1a;输入&#xff1a;nums …

Rpc原理

dubbo原理 1、RPC原理 一次完整的RPC调用流程&#xff08;同步调用&#xff0c;异步另说&#xff09;如下&#xff1a; 1&#xff09;服务消费方&#xff08;client&#xff09;调用以本地调用方式调用服务&#xff1b; 2&#xff09;client stub接收到调用后负责将方法、参数…