大数据处理学习笔记1.6 Scala数据结构

news2024/10/2 16:21:00

文章目录

  • 零、本讲学习目标
  • 一、数组 (Array)
    • (一)定长数组
      • 1、数组定义
        • (1)定义数组时初始化数据
        • (2)定义时指定数组长度,后赋值
      • 2、数组遍历
        • (1)传统for循环方式
        • (2)增强for循环方式
        • (3)利用foreach算子遍历数组
        • 课堂练习:数组求和
      • 3、常用方法
        • (1)求数组中数值总和
        • (2)求数组中的最大值
        • (3)求数组中的最小值
        • (4)对数组实现升序
        • (5)对数组实现降序
        • 课堂练习:数组查询
    • (二)变长数组
      • 1、数组定义
      • 2、数组合并
      • 3、插入元素
        • 课堂练习:产生随机整数构成的变长数组
      • 4、移除元素
  • 二、列表 (List)
    • (一)不可变列表
      • 1、创建不可变列表
      • 2、给列表添加元素
        • (1)在列表头添加元素
        • (2)在列表尾添加元素
      • 3、列表合并操作
      • 4、二维列表
    • (二)可变列表
      • 1、创建可变列表
      • 2、列表合并
      • 3、列表排序
      • 4、列表总和、平均值、最值
      • 5、添加新元素
      • 6、移除列表元素
      • 课堂练习
  • 三、映射 (Map)
    • (一)不可变映射
      • 1、创建不可变映射
      • 2、遍历不可变映射
    • (二)可变映射
      • 1、创建可变映射
      • 2、修改可变映射
      • 3、查询可变映射
      • 4、添加元素
      • 5、删除元素
  • 四、元组 (Tuple)
    • (一)定义元组
      • 1、直接赋值定义元组
      • 2、创建指定长度的元组
    • (二)访问元组
    • (三)迭代元组
    • (四)元组转为字符串
      • 课堂练习:对一个字符串进行词频统计
  • 五、集合 (Set)
    • (一)定义集合
    • (二)增减元素
    • (三)集合方法
      • 1、获取首元素
      • 2、获取去首子集合
        • 课堂练习:删除排前的三个城市
      • 3、两个集合求并集
      • 4、两个集合求交集
      • 5、求集合的最值
  • 六、课后作业
    • 任务:IP地址去重

零、本讲学习目标

  1. 掌握数组的使用
  2. 掌握列表的使用
  3. 掌握映射的使用
  4. 掌握集合的使用
  5. 掌握元组的使用

Scala集合(collection)分为可变集合(mutable collection)和不可变集合(immutable collection)。可变集合可以对其中的元素进行修改、添加、移除;而不可变集合永远不会改变,但是仍然可以模拟添加、移除或更新操作。这些操作都会返回一个新的集合,原集合的内容不发生改变。

一、数组 (Array)

  • Scala中的数组分为定长数组和变长数组,定长数组初始化后不可对数组长度进行修改,而变长数组则可以修改。

(一)定长数组

  • Array的API文档:https://www.scala-lang.org/api/current/scala/Array.html
    在这里插入图片描述

1、数组定义

(1)定义数组时初始化数据

  • 自动推断数组类型
    在这里插入图片描述

  • 手动指定数据类型
    在这里插入图片描述
    在这里插入图片描述

(2)定义时指定数组长度,后赋值

  • 先定义,后赋值
    在这里插入图片描述

  • 避免数组下标越界错误
    在这里插入图片描述

2、数组遍历

  • 定义数组arr(自动推断类型,静态初始化)
    在这里插入图片描述
  • 可以使用for循环对数组进行遍历,输出数组所有的元素

(1)传统for循环方式

  • 通过数组下标来遍历数组元素
    在这里插入图片描述

  • 大家可以看到,反向遍历没有输出结果,怎么解决这个问题?

  • 参考一下Java正向和反向遍历数组,看能否得到启发
    在这里插入图片描述

  • 通过arr.length - 1 to 0 by -1实现反向遍历
    在这里插入图片描述

  • 说明:num1 to num2 by 1 相当于 num1 to num2

(2)增强for循环方式

  • 正向遍历数组元素
    在这里插入图片描述
  • 反向遍历数组元素
    在这里插入图片描述

(3)利用foreach算子遍历数组

  • 联想Java里列表的forEach()方法结合Lambda表达式
    在这里插入图片描述
  • 利用Scala的foreach算子来遍历数组
    在这里插入图片描述

课堂练习:数组求和

  • 采用遍历算子
    在这里插入图片描述
  • 采用增强for循环
    在这里插入图片描述
  • 课堂练习:采用传统for循环来求和
    在这里插入图片描述

3、常用方法

  • Scala对数组提供了很多常用的方法,使用起来非常方便
  • 定义数组arr(通过数组类的构造方法来初始化数组,静态初始化)
    在这里插入图片描述
  • 对数组arr也可以采用先定义后赋值的方式(动态初始化)
    在这里插入图片描述

(1)求数组中数值总和

  • 调用sum方法
    在这里插入图片描述

(2)求数组中的最大值

  • 调用max方法
    在这里插入图片描述

(3)求数组中的最小值

  • 调用min方法
    在这里插入图片描述

(4)对数组实现升序

  • 调用sorted方法
    在这里插入图片描述
  • 不可变数组调用sorted方法之后会产生一个新的排序数组,而原来的数组保持不变

(5)对数组实现降序

  • 先调用sorted方法升序,再调用reverse方法反序,就可以实现数组降序
    在这里插入图片描述

课堂练习:数组查询

  • 定义一个整型数组,输入一个整数,判断该整数是否在数组里,如果在数组里,给出其位置,否则提示用户该整数不在数组里。

  • net.huawei.day03包里创建Exercise01对象
    在这里插入图片描述

  • 利用数组的contains方法判断查询目标是否在数组里,如果在数组里,就遍历输出

  • 运行结果
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 直接遍历输出等于查询目标的数组元素,统计统计满足条件的个数,如果个数等于零,说明查询目标不在数组里

  • net.huawei.day03包里创建Exercise01_对象
    在这里插入图片描述

  • 运行程序
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

(二)变长数组

  • ArrayBuffer的API文档:https://www.scala-lang.org/api/2.11.x/index.html#scala.collection.mutable.ArrayBuffer
    在这里插入图片描述

1、数组定义

  • 变长数组使用类scala.collection.mutable.ArrayBuffer进行定义

  • 定义一个变长Int类型数组arr
    在这里插入图片描述

  • 利用+=运算符添加数组元素(注意是追加元素)
    在这里插入图片描述

  • 遍历数组arr,跟遍历定长数组没有不同
    在这里插入图片描述

  • 利用-=运算符删除数组元素
    在这里插入图片描述

  • 数组中有多个值为4的元素,则从前向后删除第一个匹配的元素,本次删除,第一个4被删除了,但是第二4还依然存在。

2、数组合并

  • Scala支持使用++=符号将两个变长数组进行合并
  • 定义两个变长数组arr1arr2,合并生成变长数组arr3
    在这里插入图片描述
  • 注意:arr1会是合并后的数据,即ArrayBuffer(1, 2, 3, 4, 5, 6, 7, 8)
  • 数组arr2arr1,合并生成变长数组arr4
    在这里插入图片描述

3、插入元素

  • 使用insert()方法可以在数组指定位置插入一个元素
  • 在数组arr的下标为1的位置插入一个元素666
    在这里插入图片描述
  • 注意:一次插入多个元素是要报错的
    在这里插入图片描述
  • 如果插入的位置参数超出数组的长度,报错
    在这里插入图片描述
  • 如果插入的位置参数等于数组长度,那么就相当于在末尾追加新元素
    在这里插入图片描述

课堂练习:产生随机整数构成的变长数组

  • 产生一个变长数组,包含10个100以内的随机整数
    在这里插入图片描述
  • 三种方式来产生10个随机整数构成的变长数组
    在这里插入图片描述

4、移除元素

  • 使用remove()方法可以在数组的固定位置移除指定数量的元素
  • 从数组arr的下标为1的位置开始移除2元素
    在这里插入图片描述
  • 如果移除起始位置+删除数量 > 数组长度,那么就会报错
    在这里插入图片描述

二、列表 (List)

  • Scala中的列表分为可变列表和不可变列表,默认使用的列表为不可变列表。不可变列表也可以增加元素,但实际上生成了一个新列表,原列表不变。列表元素类型可以相同,也可以不一致。

(一)不可变列表

  • List的API文档:https://www.scala-lang.org/api/2.11.x/index.html#scala.collection.immutable.List
    在这里插入图片描述

1、创建不可变列表

  • 创建一个Int类型的列表- list1
    在这里插入图片描述
  • 创建一个混合类型的列表 - list2,元素类型被系统统一为Any
    在这里插入图片描述

2、给列表添加元素

(1)在列表头添加元素

  • 利用.+:在列表头添加新元素
  • 在列表list1的头部追加一个元素0,生成一个新列表 list3,列表list1没有变的
    在这里插入图片描述
  • 利用::在列表头添加新元素
    在这里插入图片描述

(2)在列表尾添加元素

  • 利用.:+在列表尾添加新元素
  • 在列表list1的尾部追加一个元素100,生成一个新列表 list4,列表list1没有变的
    在这里插入图片描述

3、列表合并操作

  • List也支持合并操作
  • 创建两个列表list1list2
    在这里插入图片描述
  • list1list2合并生成列表list3list1元素在前,list2元素在后
    在这里插入图片描述
  • list1list2合并生成列表list4list2元素在前,list1元素在后
    在这里插入图片描述

4、二维列表

  • 列表的列表称为二维列表
  • 定义二维列表students
    在这里插入图片描述
val students: List[List[Any]] = List(
    List(1, "李文丽", 19),
    List(2, "肖玉玲", 18),
    List(3, "郑刚林", 20))
  • 遍历二维列表students
    在这里插入图片描述
for (student <- students) {
    for (field <- student)
        print(field + "\t")
    println()
}
  • 课堂练习:两种方式遍历二维列表
    在这里插入图片描述
    在这里插入图片描述

(二)可变列表

  • ListBuffer的API文档:https://www.scala-lang.org/api/2.11.x/index.html#scala.collection.mutable.ListBuffer
    在这里插入图片描述

1、创建可变列表

  • 可变List需要使用scala.collection.mutable.ListBuffer
  • 创建列表时初始化数据
    在这里插入图片描述
  • 先创建空列表,然后添加数据
    在这里插入图片描述

2、列表合并

  • 将列表list1与列表list2合并,list1在前,list2在后
    在这里插入图片描述
  • 将列表list1与列表list2合并,list2在前,list1在后
    在这里插入图片描述
  • 注意,哪怕执行list1 :++ list2,依然是list1在前,list2在后
    在这里插入图片描述

3、列表排序

  • 列表升序和降序
    在这里插入图片描述

4、列表总和、平均值、最值

  • 计算总和、最值可以直接调用列表方法完成,平均值得自己计算
    在这里插入图片描述

5、添加新元素

  • 调用可变列表的insert(pos, value),在pos位置插入新元素value
    在这里插入图片描述
  • 特殊情况,在列表头插入新元素,pos = 0
    在这里插入图片描述
  • 特殊情况,在列表尾追加新元素,pos = list.length
    在这里插入图片描述

6、移除列表元素

  • 调用可变列表的remove(pos, count),从pos位置开始移除count个列表元素
  • 任务:移除list列表中的(1, 2, 3)元素
    在这里插入图片描述

课堂练习

  1. 创建整型可变空列表,添加1、3、5、7四个元素,在5和7之间插入元素6,移除开头的1、3两个元素,统计列表元素总和、最大值和最小值,最后将列表降序输出。
  2. 创建整型列表,包含12、5、8、12、9、7、45、16、78、10、3,分别输出奇数列表和偶数列表。
    在这里插入图片描述

三、映射 (Map)

  • Scala中的Map也分可变Map和不可变Map,默认为不可变Map。

(一)不可变映射

1、创建不可变映射

  • 创建不可变映射mp,用键->值的形式
    在这里插入图片描述
  • 创建不可变映射mp,用(键, 值)的形式
    在这里插入图片描述
  • 注意:Map是抽象类,不能实例化
    在这里插入图片描述

2、遍历不可变映射

  • 调用mp.keysforeach实现遍历
    在这里插入图片描述
  • 利用for循环来实现遍历
    在这里插入图片描述

(二)可变映射

  • 创建可变Map需要引入类scala.collection.mutable.Map,创建方式与上述不可变Map相同。

1、创建可变映射

  • 创建可变映射mmp
    在这里插入图片描述

2、修改可变映射

  • 将键02的值改为man(键02存在,执行修改操作)
    在这里插入图片描述
  • 将键05的值改为belle(键05存在,执行添加操作)
    在这里插入图片描述

3、查询可变映射

  • 查询键02的值,如果没有查到,则返回-1
    在这里插入图片描述
  • 查询键08的值,如果没有查到,则返回-1
    在这里插入图片描述

4、添加元素

  • 查看可变映射当前值
    在这里插入图片描述
  • 用两种方式添加元素
    在这里插入图片描述

5、删除元素

  • 删除存在的键 - 07 对应的元素
    在这里插入图片描述
  • 删除不存在的键 - 11 对应的元素,不报错,映射也没有变化
    在这里插入图片描述

四、元组 (Tuple)

  • 元组是一个可以存放不同类型对象的集合,元组中的元素不可以修改。

(一)定义元组

1、直接赋值定义元组

  • 定义一个元组student
    在这里插入图片描述

2、创建指定长度的元组

  • 定义指定长度的元组,其中Tuple3是一个元组类,代表元组长度为3
    在这里插入图片描述

  • 目前,Scala支持的元组最大长度为22,即可以使用Tuple1到Tuple22。元组的实际类型取决于元素数量和元素的类型。
    在这里插入图片描述

(二)访问元组

  • 使用方法_1、_2、_3访问元组的元素,与数组和字符串的位置不同,元组的元素下标从1开始。
  • 访问元组的3个元素
    在这里插入图片描述
  • 访问元组的第6个元素(不存在的元素),报错
    在这里插入图片描述

(三)迭代元组

  • 直接用for循环遍历元素是不行的
    在这里插入图片描述
  • 使用元组的productIterator()方法产生全部元素构成的迭代器,然后遍历迭代器
    在这里插入图片描述
  • 使用for循环遍历元组生成迭代器
    在这里插入图片描述

(四)元组转为字符串

  • 使用Tuple.toString()方法可将元组全部元素组合成一个字符串
    在这里插入图片描述
  • 注意:元组与字符串进行连接运算,元组会自动转换成字符串

课堂练习:对一个字符串进行词频统计

  • 读取磁盘文件,然后输出
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 采用Spark的RDD来进行词频统计,明显要简单得多
    在这里插入图片描述

五、集合 (Set)

  • Scala Set集合存储的对象不可重复。Set集合分为可变集合和不可变集合,默认情况下,Scala使用的是不可变集合,如果要使用可变集合,就需要引用scala.collection.mutable.Set类。
  • 集合的三大特点:确定性、互异性、无序性
  • 关于Set的API文档:https://www.scala-lang.org/api/2.11.x/index.html#scala.collection.mutable.Set
    在这里插入图片描述

(一)定义集合

  • 定义一个空的不可变集合set1(Nothing - 一无所有,Scala所有类的子类)
    在这里插入图片描述

  • 定义一个非空的不可变集合set2(Any - 包罗万象,Scala所有类的父类)
    在这里插入图片描述

(二)增减元素

  • 与列表一样,对于不可变集合进行元素的增加和删除实际上会产生一个新集合,原来的集合并没有改变
  • 创建一个不可变集合set
    在这里插入图片描述
  • 添加一个集合不存在的元素 - 100
    在这里插入图片描述
  • 添加一个集合存在的元素1,集合里始终只有一个1(集合具有互异性)
    在这里插入图片描述
  • 当然,23两个元素也是加不进去的
    在这里插入图片描述
  • 减去一个存在的元素2
    在这里插入图片描述
  • 减去一个不存在的元素666
    在这里插入图片描述

(三)集合方法

  • 创建一个集合cities
    在这里插入图片描述

1、获取首元素

  • 调用head方法
    在这里插入图片描述

2、获取去首子集合

  • 调用tail方法,去掉了集合里的第一个元素Shenzhen
    在这里插入图片描述

课堂练习:删除排前的三个城市

  • 去掉了排前的三个城市:ShenzhenBeijingLuzhou
    在这里插入图片描述

3、两个集合求并集

  • 利用++求两个集合的并集
  • 两个集合都有62,但是并集里只出现1
    在这里插入图片描述

4、两个集合求交集

  • 利用.&.intersect()方法求两个集合的交集
    在这里插入图片描述

5、求集合的最值

  • 利用maxmin方法求集合最值
    在这里插入图片描述

六、课后作业

任务:IP地址去重

  • 在项目根目录创建ips.txt文件
  • 创建RemoveRepeatedIPs对象完成去重工作
    在这里插入图片描述
192.168.234.21
192.168.234.22
192.168.234.21
192.168.234.21
192.168.234.23
192.168.234.21
192.168.234.21
192.168.234.21
192.168.234.25
192.168.234.21
192.168.234.21
192.168.234.26
192.168.234.21
192.168.234.27
192.168.234.21
192.168.234.27
192.168.234.21
192.168.234.29
192.168.234.21
192.168.234.26
192.168.234.21
192.168.234.25
192.168.234.25
192.168.234.21
192.168.234.22
192.168.234.21
  • 运行程序,查看结果
    在这里插入图片描述

  • 上传ips.txtied虚拟机的/home目录
    在这里插入图片描述
  • 启动Scala,导入scala.io.Source类,利用它提供的方法可以读取文件
    在这里插入图片描述
  • 读取文件/home/ips.txt文件,返回文件行lines迭代器
    在这里插入图片描述
  • 利用foreach遍历算子来遍历lines迭代器
    在这里插入图片描述
  • 创建一个空的字符串集合
    在这里插入图片描述
  • 利用for循环遍历文件行迭代器,将每一行添加到集合
    在这里插入图片描述
  • 利用遍历算子遍历集合
    在这里插入图片描述
  • 导入文件字符输出流
    在这里插入图片描述
  • 创建文件字符输出流对象,指定写入的文件
    在这里插入图片描述
  • 利用for循环遍历集合,将每个元素分行写入指定文件
    在这里插入图片描述
  • 关闭文件字符输出流
    在这里插入图片描述
  • 查看生成的distinct_ips.txt文件内容
    在这里插入图片描述

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

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

相关文章

JavaSE:异常机制

异常概念异常发生的原因用户输入非法数据要打开的文件不存在网络中断/JVM内存溢出&#xff08;JVM是JRE的一部分。它是一个虚构出来的计算机&#xff09;除0、非法参数等三种类型的异常&#xff0c;用以理解异常检查性异常【otherException】&#xff1a;程序员无法预见的&…

Linux权限相关知识(大量图文展示,及详细操作)

Linux权限相关概念 Linux下有两种用户&#xff1a;一种是超级用户&#xff08;root&#xff09;、一种是普通用户。 超级用户&#xff1a;可以在linux系统下做任何事情&#xff0c;不受限制 普通用户&#xff1a;在linux下做有限的事情。 超级用户的命令提示符是“#”&#xf…

关于excel文件导入的bug总结

从项目中获取到模板文件&#xff0c;更名 “external_platform_account_template.xls” &#xff0c;注意此时我只改了文件名没改文件属性。 文件填充内容如下&#xff1a; postman调用导入接口本地测试报错&#xff0c;错误如下&#xff1a; 报错信息&#xff1a; The supp…

微信扫码登录

一、准备工作 微信开发者平台&#xff1a;https://open.weixin.qq.com 1、注册 2、邮箱激活 3、完善开发者资料 4、开发者资质认证&#xff1a;仅能企业注册&#xff08;后面提供学习的使用渠道&#xff09;准备营业执照&#xff0c;1-2个工作日审批、300元 5、创建网站应用&…

leetcode 61~70 学习经历

leetcode 61~70 学习经历61. 旋转链表62. 不同路径63. 不同路径 II64. 最小路径和65. 有效数字66. 加一67. 二进制求和68. 文本左右对齐69. x 的平方根70. 爬楼梯小结61. 旋转链表 给你一个链表的头节点 head &#xff0c;旋转链表&#xff0c;将链表每个节点向右移动 k 个位置…

【论文精读】Benchmarking Deep Learning Interpretability in Time Series Predictions

【论文精读】Benchmarking Deep Learning Interpretability in Time Series Predictions Abstract Saliency methods are used extensively to highlight the importance of input features in model predictions. These methods are mostly used in vision and language task…

嵌入式 Linux多进程

目录 一、Linux进程概述 1、进程标识 2、进程的运行身份 3、进程的状态 4、Linux下进程的结果及管理 5、一些进程相关信息&相关命令 进程process&#xff1a; 进程相关命令&#xff1a; 二、Linux进程创建与控制 1、fork进程创建函数 2、进程的终止 3、wait和wa…

react setState学习记录

react setState学习记录1.总体看来2.setState的执行是异步的3.函数式setState1.总体看来 (1). setState(stateChange, [callback])------对象式的setState 1.stateChange为状态改变对象(该对象可以体现出状态的更改) 2.callback是可选的回调函数, 它在状态更新完毕、界面也更新…

【微信小程序】-- WXSS 模板样式- 全局样式和局部样式(十四)

&#x1f48c; 所属专栏&#xff1a;【微信小程序开发教程】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &…

taobao.opensecurity.isv.uid.get( 获取open security uid for isv )

&#xffe5;免费不需用户授权 根据 open_uid 获取 open_uid_isv 用于同一个 isv的多个app间数据关联 公共参数 请求地址: HTTP地址 http://gw.api.taobao.com/router/rest 公共请求参数: 点击获取key和secret 请求示例 TaobaoClient client new DefaultTaobaoClient(url, a…

你想要的Android性能优化系列:启动优化 !

App启动优化为什么要做App的启动优化&#xff1f;网页端存在的一个定律叫8秒定律&#xff1a;即指用户访问一个网站时&#xff0c;如果等待打开的时间超过8秒&#xff0c;超过70%的用户将会放弃等待。同样的&#xff0c;移动端也有一个8秒定律&#xff1a;如果一个App的启动时间…

华为OD机试题【乱序整数序列两数之和绝对值最小】用 C++ 编码,速通 (2023.Q1)

最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧文章目录 最近更新的博客使用说明乱序整…

嵌入式学习笔记——概述

嵌入式系统概述前言“嵌入式系统”概念1.是个啥&#xff1f;2.可以干啥&#xff1f;3.有哪些入坑方向&#xff1f;4.入坑后可以有多少薪资&#xff1f;单片机1.什么是单片机&#xff1f;2.架构简介3.基于ARM架构的单片机结构简介总结前言 断更很长时间了&#xff0c;写博客确实…

【Leedcode】栈和队列必备的面试题(第四期)

【Leedcode】栈和队列必备的面试题&#xff08;第四期&#xff09; 文章目录【Leedcode】栈和队列必备的面试题&#xff08;第四期&#xff09;一、题目二、思路图解1.声明结构体2.循环链表开辟动态结构体空间3.向循环队列插入一个元素4.循环队列中删除一个元素5. 从队首获取元…

STM32C0介绍(1)----概述

概述 STM32C0系列微控制器是意法半导体公司推出的一款低功耗、高性能的微控制器产品。它们被设计用于需要小型、低功耗和高度可集成的应用程序&#xff0c;如传感器、消费品、电池供电设备、家庭自动化和安全等应用。该系列的微控制器采用ARM Cortex-M0内核&#xff0c;具有丰…

软件测试之缺陷

缺陷 1. 软件缺陷的概述 1.1 软件缺陷定义 软件缺陷, 通常又被叫做bug或者defect, 即为软件或程序中存在的某种破坏正常运行能力的问题、错误,其存在会导致软件产品在某种程度上不能满足用户的需求. 软件缺陷是指存在于软件(程序、数据、文档中的)那些不符合用户需求的问题.…

Ubuntu 交叉编译工具链安装

Ubuntu 交叉编译工具链安装 1 交叉编译器安装 ARM 裸机、Uboot 移植、Linux 移植这些都需要在 Ubuntu 下进行编译&#xff0c;编译就需要编译器&#xff0c;我们在第三章“Linux C 编程入门”里面已经讲解了如何在 Liux 进行 C 语言开发&#xff0c;里面使用 GCC 编译器进行代…

如何使用bomber扫描软件物料清单(SBOM)以查找安全漏洞

关于bomber bomber是一款针对软件物料清单&#xff08;SBOM&#xff09;的安全漏洞扫描工具&#xff0c;广大研究人员可以通过该工具扫描和检测软件物料清单&#xff08;SBOM&#xff09;。 当你向一家供应商索要了他们的一个封闭源代码产品的软件材料清单&#xff0c;而他们…

Spring6全面详解

Spring6全面详解 自2022年11月&#xff0c;Spring6正式发布。在Spring6中&#xff0c;对于JDK的要求最低为 17。&#xff08;17 - 19&#xff09; 部分文本摘抄于尚硅谷视频&#xff08;bilibili&#xff09;做了一定的排版和个人的理解。如果不是很熟悉&#xff0c;可以去看 …

ABAP 辨析 标准表|排序表|哈希表

1、文档介绍 本文档将介绍内表的区别和用法&#xff0c;涉及标准表、排序表、哈希表 2、用法与区别 2.1、内表种类 内表顶层为任意表&#xff0c;任意表分为索引表和哈希表&#xff0c;索引表又可分为标准表和排序表&#xff0c;结构如图&#xff1a; 2.2、内表用法 2.2.1…