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 = [张三, 李四, 王五, 赵六]//  elefor (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 = [张三, 李四, 王五, 赵六]//  elelists.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("--------------------------");}
}

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

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

相关文章

word转pdf怎么转?几种常用方法分享

word转pdf怎么转&#xff1f;在日常工作和学习中&#xff0c;将Word文档转换为PDF格式是一项必要的任务。不仅可以保证文档的格式不变&#xff0c;还可以防止文档被他人篡改。但是&#xff0c;Word文档并不是所有人都能够轻松打开和编辑的&#xff0c;而PDF文件则可以在各种设备…

【更新】119所院校考研重点勾画更新预告!

截至目前&#xff0c;我已经发布了47篇不同院校的择校分析。发布了87套名校信号考研真题以及119所不同院校的考研知识点重点勾画。 另外为了更好服务已经报名的同学&#xff0c;24梦马全程班也到了收尾的阶段。即将封班&#xff01;需要报名的同学抓紧啦&#xff01; 去年开始…

从excel中提取嵌入式图片的解决方法

1 发现问题 我的excel中有浮动图片和嵌入式图片&#xff0c;但是openpyxl的_image对象只提取到了浮动图片&#xff0c;通过阅读其源码发现&#xff0c;这是因为openpyxl只解析了drawing文件导致的&#xff0c;所以确定需要自己解析 2 解决思路 1、解析出media资源 2、解析…

React 路由使用-详细介绍

路由初使用 抽象路由模块 src\page\Article\index.js const Article () > {return (<div><p>文章页</p></div>); };export default Article;src\router\index.js // 导入页面 import Article from "../page/Article"; import Login fr…

MySQL第六七弹,自连接等复杂查询,索引部分知识

一、&#x1f49b; 自连接&#xff1a;自己和自己笛卡尔积&#xff08;奇淫巧技&#xff0c;特殊场景很牛逼&#xff09; SQL&#xff1a;编写条件都是列和列之间的比较&#xff0c;但是SQL无法进行&#xff0c;行与行之间的比较。 如&#xff1a;显示所有java比计算机原理高的…

服务端高并发分布式结构演进之路

目录 一、常见概念 1.1基本概念 二、架构演进 2.1单机架构 2.2应用数据分离架构 2.3应用服务集群架构 2.4读写分离 / 主从分离架构 2.5引入缓存 —— 冷热分离架构 2.6垂直分库 2.7业务拆分 —— 微服务 一、常见概念 1.1基本概念 应用&#xff08;Application&am…

2023华数杯数学建模C题思路分析 - 母亲身心健康对婴儿成长的影响

# 1 赛题 C 题 母亲身心健康对婴儿成长的影响 母亲是婴儿生命中最重要的人之一&#xff0c;她不仅为婴儿提供营养物质和身体保护&#xff0c; 还为婴儿提供情感支持和安全感。母亲心理健康状态的不良状况&#xff0c;如抑郁、焦虑、 压力等&#xff0c;可能会对婴儿的认知、情…

硬件串口通信协议学习(UART、IIC、SPI、CAN)

0.前言 学习资料&#xff1a;江协科技的个人空间-江协科技个人主页-哔哩哔哩视频 通信的目的&#xff1a;将一个设备的数据传送到另一个设备&#xff0c;扩展硬件系统通信协议&#xff1a;制定通信的规则&#xff0c;通信双方按照协议规则进行数据收发 全双工&#xff1a;通信…

腾讯云COS+PicGO+截图工具+Obsidian+Typora+蚁小二:打造丝滑稳定的Markdown写作和分发环境

目录 背景 工具说明 腾讯云COS PicGO图片上传工具 截图工具 Obsidian Typora 蚁小二 首次配置完整演示步骤 腾讯云COS PicGO图片上传工具 截图工具 Obsidian Typora 蚁小二 使用总结&#xff08;简单又丝滑的编辑步骤&#xff09; 背景 很久很久以前&#xff…

【蓝图】p47下车减速功能

p47下车减速功能 p47下车减速功能加速功能下车减速功能 p47下车减速功能 加速功能 上图是ue自带的加速功能&#xff0c;检测到按w时输入轴会传1给设置油门输入&#xff0c;就会加速 所以&#xff0c;减速也可以通过蓝图反方向制作 下车减速功能 打开Sedan蓝图类的上下车图表…

Java网络编程

目录 1.网络编程 2.Echo模型&#xff08;服务器与客户端实现通信&#xff09; 3.BIO处理模型(实现多用户访问同个服务器) 4.UDP程序 1.网络编程 有两种通信模型 C/S(Client/Server)基于客户端和服务器端&#xff0c;实现代码时候需要实现客户端与服务器端 B/S(Browser/S…

QtWebApp开发https服务器,完成客户端与服务器基于ssl的双向认证

引言&#xff1a;所谓http协议&#xff0c;本质上也是基于TCP/IP上服务器与客户端请求和应答的标准&#xff0c;web开发中常用的http server有apache和nginx。Qt程序作为http client可以使用QNetworkAccessManager很方便的进行http相关的操作。Qt本身并没有http server相关的库…

使用Git在GitHub上部署静态页面

在GitHub中&#xff0c;我们可以将自己的静态页面部署到GitHub中&#xff0c;它会给我们提供一个地址使得我们的页面变成一个真正的网站&#xff0c;可以供用户访问。 一、在GitHub下创建仓库 二、将项目部署到GitHub上 1. 初始化Git仓库 2. 提交代码 3. 关联远程仓库 在Gi…

【java安全】原生反序列化利用链JDK7u21

文章目录 【java安全】原生反序列化利用链JDK7u21前言原理equalsImpl()如何调用equalsImpl()&#xff1f;HashSet通过反序列化间接执行equals()方法如何使hash相等&#xff1f; 思路整理POCGadget为什么在HashSet#add()前要将HashMap的value设为其他值&#xff1f; 【java安全】…

WSL1升级为WSL2

首先需要启用组件 使用管理员打开Powershell并运行 Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform启用后会要求重启计算机 从https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi获取WSL2 Linux内核更新包&#xff0c;…

HTML 是什么?它的全称是什么?

聚沙成塔每天进步一点点 专栏简介HTML是什么&#xff1f;HTML的全称是什么&#xff1f;写在最后 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为那些对We…

ad+硬件每日学习十个知识点(16)23.7.27 (总线保持、lin报文、逻辑器件手册解读)

文章目录 1.总线保持是怎么实现的&#xff1f;有什么需要注意的&#xff08;驱动电流和电阻&#xff09;&#xff1f;2.LIN报文3.芯片datasheet的features、applications、description看完&#xff0c;应该能大致判断逻辑器件能否满足我们的要求。4.什么是逻辑器件的传输延时&a…

WiFi无线组网温湿度实时监测系统

近年来随着我国电子技术和无线通信技术的快速发展&#xff0c;远距离数据采集传输被应用到众多领域&#xff0c;由于事关环境安全和生命健康&#xff0c;受到了各行各界的关注。在温湿度监测中&#xff0c;目前采用的通信技术主要是4G、WiFi、以太网、LoRa等&#xff0c;今天&a…

docker删除容器(步骤详解)

要在Docker中删除容器&#xff0c;需要使用命令docker rm。 下面是详细步骤&#xff1a; 1. 首先&#xff0c;使用docker ps命令查看当前正在运行的容器。这个命令会列出所有正在运行的容器的ID、名称、状态等信息。 如果没有正在运行的容器可以通过docker ps -a 查看当前所…

[Qt]FrameLessWindow实现调整大小、移动弹窗并具有Aero效果

说明 我们知道QWidget等设置了this->setWindowFlags(Qt::FramelessWindowHint);后无法移动和调整大小&#xff0c;但实际项目中是需要窗口能够调整大小的。所以以实现FrameLess弹窗调整大小及移动弹窗需求&#xff0c;并且在Windows 10上有Aero效果。 先看一下效果&#xf…