集合-CollectionListSet

news2024/10/5 23:27:14

Collection体系的特点、使用场景总结

如果希望元素可以重复,又有索引,索引查询要快?

  • 用ArrayList集合, 基于数组的。(用的最多)

如果希望元素可以重复,又有索引,增删首尾操作快?

  • 用LinkedList集合, 基于链表的。

如果希望增删改查都快,但是元素不重复、无序、无索引。

  • 用HashSet集合,于哈希表的。

如果希望增删改查都快,但是元素不重复、有序、无索引。

  • 用LinkedHashSet集合, 于哈希表和双链表。

如果要对对象进行排序。

  • 用TreeSet集合, 基于红黑树。后续也可以用List集合实现排序。

数组的特点

  • 数组定义完成并启动后,类型确定、长度固定。

  • 不适合元素的个数和类型不确定的业务场景,更不适合做需要增删数据操作。

  • 数组的功能也比较的单一,处理数据的能力并不是很强大。

集合的特点

  • 集合的大小不固定,启动后可以动态变化,类型也可以选择不固定。集合更像气球。
  • 集合非常适合元素个数不能确定,且需要做元素的增删操作的场景。
  • 同时,集合提供的种类特别的丰富,功能也是非常强大的,开发中集合用的更多。

1、数组和集合的元素存储的个数问题。

  • 数组定义后类型确定,长度固定
  • 集合类型可以不固定,大小是可变的。

2、数组和集合存储元素的类型问题。

  • 数组可以存储基本类型和引用类型的数据。
  • 集合只能存储引用数据类型的数据。

3、数组和集合适合的场景

  • 数组适合做数据个数和类型确定的场景。
  • 集合适合做数据个数不确定,且要做增删元素的场景,集合种类更多,功能更强大。

集合

集合的体系特点

  • Collection代表单列集合,每个元素(数据)只包含一个值。
  • Map代表双列集合,每个元素包含两个值(键值对)。
  • 集合中存储的是元素的什么信息?
    • 集合中存储的是元素对象的地址。

集合体系结构

image-20240413141849783

Collection集合体系

image-20240413125332420

Collection集合的特点

  • List系列集合:有序、可重复 有索引
    • ArrayList、LinekdList: 有序、可重复 有索引
  • Set系列集合:无序、不重复 无索引
    • HashSet: 无序、不重复、无索引
    • LinkedHashSet: 有序、不重复、无索引
    • TreeSet:按照大小默认升序排序、不重复、无索引。

Collection的常用方法

1、集合的代表是?

  • Collection接口。

2、Collection集合分了哪2大常用的集合体系?

  • List系列集合:添加的元素是有序、可重复、有索引。
  • Set系列集合:添加的元素是无序、不重复、无索引。

3、如何约定集合存储数据的类型,需要注意什么?

  • 集合支持泛型。
  • 集合和泛型不支持基本类型,只支持引用数据类型。

为啥要先学Collection的常用方法?

Collection是单列集合的祖宗,它规定的方法(功能)是全部单列集合都会继承的。

Collection的常见方法如下:

方法名说明
public boolean add(E e)把给定的对象添加到当前集合中
public void clear()清空集合中所有的元素
public boolean remove(E e)把给定的对象在当前集合中删除
public boolean contains(Object obj)判断当前集合中是否包含给定的对象
public boolean isEmpty()判断当前集合是否为空
public int size()返回集合中元素的个数。
public Object[] toArray()把集合中的元素,存储到数组中

Collection的遍历方式

迭代器

迭代器是用来遍历集合的专用方式(数组没有迭代器),在Java中迭代器的代表是Iterator。

Collection集合获取迭代器的方法

方法名称说明
Iterator iterator()返回集合中的迭代器对象,该迭代器对象默认指向当前集合的第一个元素

Iterator迭代器中的常用方法

方法名称说明
boolean hasNext()询问当前位置是否有元素存在,存在返回true,不存在返回false
E next()获取当前位置的元素, 并同时将迭代器对象指向下一个元素处。
Iterator<String> it = lists.iterator();
while(it.hasNext()){
    String ele = it.next();
    System.out.println(ele);
}

1、迭代器的默认位置在哪里。
Iterator<E> iterator():得到迭代器对象,默认指向当前集合的索引0
2、迭代器如果取元素越界会出现什么问题。
会出现NoSuchElementException异常。
image-20230508115342189
增强for循环

1、增强for可以遍历哪些容器?

  • 既可以遍历集合也可以遍历数组。

2、增强for的关键是记住它的遍历格式

for(元素数据类型 变量名 : 数组或者Collection集合) { //在此处使用变量即可,该变量就是元素 }
    
Collection<String> c = new ArrayList<>();  ...
for(String s : c) {
    System.out.println(s);
}
增强for可以用来遍历集合或者数组。
增强for遍历集合,本质就是迭代器遍历集合的简化写法。
Lambda表达式遍历集合

Lambda表达式,提供了一种更简单、更直接的方式来遍历集合。

需要使用Collection的如下方法来完成

方法名称说明
default void forEach(Consumer<? super T> action)结合lambda遍历集合
Collection<String> lists = new ArrayList<>(); ...
lists.forEach(new Consumer<String>() {
    @Override
    public void accept(String s) {
        System.out.println(s);
    }
});
转为
lists.forEach(s -> {
    System.out.println(s);
});
//  lists.forEach(s -> System.out.println(s));

集合存储对象的原理
image-20240413152713436

集合的并发修改异常问题

问题引出

  • 使用迭代器遍历集合时,又同时在删除集合中的数据,程序就会出现并发修改异常的错误。
  • 由于增强for循环遍历集合就是迭代器遍历集合的简化写法,因此,使用增强for循环遍历集合,又在同时删除集合中的数据时,程序也会出现并发修改异常的错误

怎么保证遍历集合同时删除数据时不出bug?

  • 使用迭代器遍历集合:但用迭代器自己的删除方法删除数据即可。
  • 使用增强for循环遍历集合:无法解决这个问题
  • 使用普通for循环遍历集合:可以倒着遍历并删除;或者从前往后遍历,但删除元素后做i --操作。

List集合

有序,可重复,有索引。

List特有方法

collection集合体系

image-20230508122146507

List集合特有方法

  • List集合因为支持索引,所以多了很多索引操作的独特api,其他Collection的功能List也都继承了。
方法名称说明
void add(int index,E element)在此集合中的指定位置插入指定的元素
E remove(int index)删除指定索引处的元素,返回被删除的元素
E set(int index,E element)修改指定索引处的元素,返回被修改的元素
E get(int index)返回指定索引处的元素

List集合的遍历方式有几种?

  • 迭代器
  • 增强for循环
  • Lambda表达式
  • for循环(因为List集合存在索引)

ArrayList集合的底层原理

  • ArrayList底层是基于数组实现的
    • 查询速度快(注意: 是根据索引查询数据快): 查询数据通过地址值和索引定位,查询任意数据耗时相同。
    • 删除效率低:可能需要把后面很多的数据进行前移。
    • 添加效率极低:可能需要把后面很多的数据后移,再添加元素;或者也可能需要进行数组的扩容。
  1. 利用无参构造器创建的集合,会在底层创建一个默认长度为0的数组

  2. 添加第一个元素时,底层会创建一个新的长度为10的数组

    List<String> list1 = new ArrayList<>();list1.add("a");

  3. 存满时,会扩容1.5倍

  4. 如果一次添加多个元素,1.5倍还放不下,则新创建数组的长度以实际为准

应用场景
  • ArrayList适合:
  • 根据索引查询数据, 比如根据随机索引取数据(高效)! 或者数据量不是很大时
  • ArrayList不适合:
    • 数据量大的同时, 又要频繁进行增删操作

List集合的遍历方式有几种?

  • 迭代器
  • 增强for循环
  • Lambda表达式
  • for循环(因为List集合存在索引)

LinkedList集合底层原理

基于双链表实现的

查询慢,增删相对较快,但对首尾元素进行增删改查的速度是极快的。

什么是链表? 有啥特点?

  • 链表中的结点是独立的对象,在内存中是不连续的,每个结点包含数据值和下一个结点的地址。

特点:

  • 链表的特点1:查询慢,无论查询哪个数据都要从头开始找。
  • 链表的特点2:增删首尾元素是非常快的
image-20240413161305139

image-20240413161504349

image-20240413161639992

LinkedList集合的特有功能

方法名称说明
public void addFirst(E e)在该列表开头插入指定的元素
public void addLast(E e)将指定的元素追加到此列表的末尾
public E getFirst()返回此列表中的第一个元素
public E getLast()返回此列表中的最后一个元素
public E removeFirst()从此列表中删除并返回第一个元素
public E removeLast()从此列表中删除并返回最后一个元素
应用场景
  • 可以用来设计队列

    • 先进先出, 后进后出
  • 可以用来设计栈

    • 后进先出,先进后出

Set集合

介绍

Collection集合体系

image-20240413163552073

Set系列集合特点: 无序; 不可重复

  • 无序:存取顺序不一致
  • 不重复:可以去除重复
  • 无索引: 没有带索引的方法,所以不能使用普通for循环遍历,也不能通过索弓l来获取元素。
  • HashSet:无序、 不重复、无索引.

  • LinkedHashSet: 有序、不重复、无索引。

  • TreeSet: 排序、不重复、无索引。

  • 注意:

    • Set要用到的常用方法,基本上就是Collection提供的!!
    • 自己几乎没有额外新增一些常用功能!

HashSet

Hash值

注意:在正式了解HashSet集合的底层原理前,我们需要先搞清楚一个前置知识:哈希值!

  • 就是一个int类型的数值,Java中每个对象都有一个哈希值。
  • Java中的所有对象,都可以调用Obejct类提供的hashCode方法,返回该对象自己的哈希值。

public int hashCode():返回对象的哈希码值。

对象哈希值的特点

  • 同一个对象多次调用hashCode()方法返回的哈希值是相同的。
  • 不同的对象,它们的哈希值一般不相同,但也有可能会相同(哈希碰撞)。
  • Object的hashCode方法根据"对象地址值"计算哈希值子类重写后的hashCode方法可以根据"对象属性值"计算哈希值

HashSet集合判定两个对象的标准就是两个对象的hash值是否一致, 因此我们经常重写hashcode实现集合中对象去重

  • 如果希望Set集合认为2个内容相同的对象是重复的应该怎么办?
  • 重写对象的hashCode和equals方法。
底层原理
  • HashSet集合底层采取哈希表存储的数据。
  • 哈希表是一种对于增删改查数据性能都较好的结构。

哈希表的组成

  • JDK8之前的, 底层使用数组+链表组成
  • JDK8开始后,底层采用数组+链表+红黑树组成。

在了解哈希表之前需要先理解哈希值的概念

哈希值

  • 是JDK根据对象的地址, 按照某种规则算出来的int类型的数值。

Object类的API

  • public int hashCode0:返回对象的哈希值

对象的哈希值特点

  • 同一个对象多次调用hashCode0方法返回的哈希值是相同的
  • 默认情况下,不同对象的哈希值是不同的。
image-20230508124709994

哈希表的详细流程

  • 创建一个默认长度16,默认加载因为0.75的数组,数组名table
  • 根据元素的哈希值跟数组的长度计算出应存入的位置
  • 判断当前位置是否为null,如果是null直接存入,如果位置不为null,表示有元素, 则调用equals方法比较属性值,如果一样,则不存,如果不一样,则存入数组。
  • 当数组存满到16*0.75=12时,就自动扩容,每次扩容原先的两倍

JDK8开始,当链表长度超过8,且数组长度>=64时,自动将链表转成红黑树

image-20230508124924102

树结构(了解)
image-20240413170017082

了解数据结构

image-20240413170105743

(树)

image-20240413170244912
  • 二叉树存在的问题:

    • 当数据已经是排好序的,导致查询的性能与单链表一样,查询速度变慢!
  • 平衡二叉树

    • 在满足查找二叉树的大小规则下,让树尽可能矮小,以此提高查数据的性能。

红黑树,就是可以自平衡的二叉树

  • 红黑树是一种增删改查数据性能相对都较好的结构。
  • 左右子树高度差大于 1 便会调整
image-20240413170612905
/*
HashSet集合的底层原理
    JDK8之前: 数组+链表
    JDK8开始: 数组+链表+红黑树

树结构
    二叉树: 基本模型
        每一个根节点最多只能有两个子节点,子节点数量称为度,树的总层数为树高
        左子节点
        右子节点
        左子树
        右子树

    二叉查找/二又搜索树: BST (Binary Search  Tree)
        小的存左边,大的存右边,相同则不存
        如果数据已经排好序,那么存入二又树查找树,会形成类似链表结构,查询效率还是低
        如果左、右子树的树高差比较大,那么导致左右子树不平衡,影响查询效率

    平衡二叉树: AVL (Balanced  Binary Tree)
        有规律且相对平衡的二叉树
        当插入一个元素,导致左右子树的树高差大于1。那么就会触发旋转
        旋转分为左旋和右旋,用来保证左右子树的相对平衡

    红黑: RBT (Red-Black  Tree)
        特殊的/自平衡的二又查找树,是计算机科学中用到的一种数据结构
        1972年出现时被称为平衡二叉树,后来1978年被修改为如今的红黑树
        红黑树不是高度平衡的,有自己保证平衡的规则(红黑规则),性能较好,红黑规则如下:
            每一个节点都是红色或者黑色的
            根节点必须是黑色的
            两个红色节点不能相连
            如果一个节点没有子节点,则该节点相应的指针属性为Nil (称为叶子结点),叶子结点是黑色的
            对于每一个节点,到其所有后代叶节点的简单路径上,包含的黑色 节点数量相同
*/

手撕平衡二叉树

手撕红黑树

总结

JDK8开始,当链表长度超过8,且数组长度>=64时,自动将链表转成红黑树

HashSet集合的底层原理是什么样的?

  • 结构: 数组 + 链表 8-
    数组 + 链表 + 红黑树 8+

  • 数组初始16,加载因子0.75, 新数组是原来老数组的2倍

  • 对元素进行HashCode % 16[0~15]

  • 如果索引对应的值是null, 先equal比较, 如果一样不存储,
    如果不一样, 8- 存储新的, 老的挂载新的下面 8+ 新的挂载到老的下面

  • 扩容: 加载因子计算什么时候开始扩容 16 * 0.75= 12
    创建新的数组, 长度是原来的两倍, 重新计算索引放入新的数组中

  • 基于哈希表实现的。

  • JDK8之前的,哈希表:底层使用数组+链表组成

  • JDK8开始后,哈希表:底层采用数组+链表+红黑树组成。

HashSet集合利用哈希表操作数据的详细流程是咋回事?

  • 创建一个默认长度16,默认加载因为0.75的数组,数组名table
  • 根据元素的哈希值跟数组的长度计算出应存入的位置
  • 判断当前位置是否为null,如果是null直接存入,如果位置不为null,表示有元素,
  • 则调用equals方法比较属性值,如果一样,则不存,如果不一样,则存入数组.
  • 当数组存满到16*0.75=12时,就自动扩容,每次扩容原先的两倍

LinkedHashSet

底层原理
  • LinkedHashSet是不可重复的,存取有序的,底层是基于哈希表**(数组、链表、红黑树)**实现的。
  • 但是,它的每个元素都额外的多了一个双链表的机制记录它前后元素的位置。
image-20240413170955068

TreeSet

  • 特点:不重复、无索引、可排序(默认升序排序 ,按照元素的大小,由小到大排序)
  • 底层是基于红黑树实现的排序。

注意:

  • 对于数值类型:Integer , Double,默认按照数值本身的大小进行升序排序。
  • 对于字符串类型:默认按照首字符的编号升序排序。
  • 对于自定义类型如Teacher对象,TreeSet默认是无法直接排序的。
自定义排序规则
  • TreeSet集合存储自定义类型的对象时,必须指定排序规则,支持如下两种方式来指定比较规则。

方式一:自然排序

  • 让自定义的类(如教师类)实现Comparable接口,重写里面的compareTo方法来指定比较规则。

方式二:比较器排序

  • 通过调用TreeSet集合有参数构造器,可以设置Comparator对象(比较器对象,用于指定比较规则)。
public TreeSet(Comparator<? super E> comparator)

总结
  • TreeSet集合的特点是怎么样的?

    • 可排序、不重复
    • 底层基于红黑树实现排序,增删改查性能较好
  • TreeSet集合对自定义类型的对象排序,有几种方式指定比较规则?

    • 2种
    • 类实现Comparable接口,重写比较规则。
    • 集合自定义Comparator比较器对象,重写比较规则。

Collection集合特点

  • List系列集合:有序,可重复
  • ArrayList、LinekdList
  • Set系列集合:无序,不可重复
  • HashSet:
  • LinkedHashSet: 有序、不重复、无索引(底层基于哈希表,使用双链表记录添加顺序。)
  • TreeSet:可排序、不重复、无索引(底层基于红黑树实现排序,增删改查性能较好)

1、如果希望记住元素的添加顺序,需要存储重复的元素,又要频繁的根据索引查询数据?

  • 用ArrayList集合(有序、可重复、有索引),底层基于数组的。(常用)

2、如果希望记住元素的添加顺序,且增删首尾数据的情况较多?

  • 用LinkedList集合(有序、可重复、有索引),底层基于双链表实现的。

3、如果不在意元素顺序,也没有重复元素需要存储,只希望增删改查都快?

  • 用HashSet集合(无序,不重复,无索引),底层基于哈希表实现的。 (常用)

4、如果希望记住元素的添加顺序,也没有重复元素需要存储,且希望增删改查都快?

  • 用LinkedHashSet集合(有序,不重复,无索引), 底层基于哈希表和双链表。

5、如果要对元素进行排序,也没有重复元素需要存储?且希望增删改查都快?

  • 用TreeSet集合,基于红黑树实现。

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

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

相关文章

64B/66B编码 自定义PHY层设计

一、前言 之前的一篇文章讲解了64B/66B的基本原理&#xff0c;本篇在基于64B/66B GT Transceiver的基础之上设计自定义PHY。基本框图如下。 二、GT Mdule GT Module就按照4个GT CHannel共享一个GT COMMON进行设置&#xff0c;如下图。要将例子工程中的GT COMMON取出&#xff…

win10 鼠标箭头自己乱动解决方案

我这里只说我碰到的然后我的解决方案&#xff0c;不一定对其他问题有效&#xff1b; 1. 首先拔掉鼠标线查看鼠标箭头是否仍然在乱动&#xff0c;如果是则非鼠标问题&#xff0c;如果不再乱动则是鼠标的问题&#xff1b;验证非鼠标问题&#xff1b; 2. 因为鼠标乱动跟鼠标无关…

Transformer杀疯了!王炸成果荣登Nature,实现无限上下文长度

继DeepMind的新设计MoD大幅提升了 Transformer 效率后&#xff0c;谷歌又双叒开始爆改了&#xff01; 与之前荣登Nature子刊的life2vec不同&#xff0c;谷歌的新成果Infini-attention机制&#xff08;无限注意力&#xff09;将压缩内存引入到传统的注意机制中&#xff0c;并在…

python--4函数def,本质、值传递、引用传递、默认值参数、*参数名、**变量、lambda [参数]: 函数、偏函数、递归、递归练习

学习目标&#xff1a; 函数def,本质、值传递、引用传递、默认值参数、*参数名、**变量、lambda [参数]: 函数、偏函数、递归、 递归练习 学习内容&#xff1a; 函数def,本质、值传递、引用传递、默认值参数、*参数名、**变量、lambda [参数]: 函数、偏函数、递归、 递归练习 …

CSS中position属性总结

CSS中position属性的总结 如果我的文章看不懂&#xff0c;不要犹豫&#xff0c;请直接看阮一峰大佬写的文章 https://www.ruanyifeng.com/blog/2019/11/css-position.html 1 干嘛用的 用来定位HTML元素位置的&#xff0c;通过top、bottom、right、left定位元素 分别有这些值&a…

3D模型格式转换工具HOOPS Exchange:3D CAD数据的快速导入与导出

在当今的工程设计领域中&#xff0c;快速且可靠地处理3D CAD数据是至关重要的。HOOPS Exchange SDK通过提供一组C软件库&#xff0c;为开发团队提供了实现这一目标的有效工具。 什么是HOOPS Exchange&#xff1f; HOOPS Exchange是一组C软件库&#xff0c;旨在为开发团队提供…

DNS服务器的管理与配置

目录 一、相关知识 域名空间 DNS服务器分类 域名解析过程 资源记录 二、安装DNS服务 安装bind软件包 DNS服务的启动与停止 配置主要名称服务器 主配置文件 从例子学起&#xff1a; &#xff08;1&#xff09;建立主配置文件named.conf &#xff08;2&#xff09;…

OpenHarmony网络协议通信c-ares [交叉编译]异步解析器库

简介 c-ares是异步解析器库&#xff0c;适用于需要无阻塞地执行 DNS 查询或需要并行执行多个 DNS 查询的应用程序。 下载安装 直接在OpenHarmony-SIG仓中搜索c-ares并下载。 使用说明 以OpenHarmony 3.1 Beta的rk3568版本为例 将下载的c-ares库代码存在以下路径&#xff1a;…

上位机图像处理和嵌入式模块部署(树莓派4b实现固件主流程)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 软件开发一般有软件需求、架构设计和详细设计、软件测试这四个部分。软件需求和软件测试都比较好理解&#xff0c;前者是说要实现哪些功能&#xf…

【SpringBoot+VUE+ELEMENT 】前后端分离的管理系统的实现——基础功能(记录向)

一个前后端分离的实现。后端使用SpringBoot&#xff0c;前端使用Vue&#xff0c;后端标准的四层结构&#xff0c;前端是用的Element。 一、环境准备 1.安装node.js Node.js 是一个开源的、跨平台的 JavaScript 运行时环境。 成功后cmd中运行 node -v npm -v 出现 对应的版本…

活动 | 华院计算与数学家一起走进世界轨道交通之都-中国株洲

4月17日&#xff0c;由株洲市人民政府主办、株洲高新区管委会承办&#xff0c;华院计算技术&#xff08;上海&#xff09;股份有限公司&#xff08;以下简称“华院计算”&#xff09;协办的“制造名城、院士同行&#xff0c;数学家走进株洲”活动在湖南株洲举行。 来自中国数学…

匿名函数与gorm中的Transaction事务方法

整理下go中的匿名函数&#xff0c;项目中很多地方都在用。 1、函数类型的变量 Go中&#xff0c;函数也是一种数据类型。定义一个函数&#xff0c;把这个函数赋值给一个变量&#xff0c;这个变量就是函数类型的变量&#xff0c;用这个变量等价于直接调函数&#xff1a; packa…

算法刷题记录2

4.图 4.1.被围绕的区域 思路&#xff1a;图中只有与边界上联通的O才不算是被X包围。因此本题就是从边界上的O开始递归&#xff0c;找与边界O联通的O&#xff0c;并标记为#&#xff08;代表已遍历&#xff09;&#xff0c;最后图中剩下的O就是&#xff1a;被X包围的O。图中所有…

使用LVGL提升交互效率:基于启明智显Model3A方案的7寸智能屏用户界面(UI)设计介绍

项目概述&#xff1a; 【启明智显】&#xff0c;作为一家专注于HMI和AIoT解决方案的公司&#xff0c;我们致力于为用户提供创新、可靠且高效的产品和解决方案。近日我们推出了高性能及高性价比的HMI芯片——Model3A。芯片搭载了强大的2D图形加速引擎&#xff0c;能够提供高达7…

RNN知识体系构筑:详尽阐述其理论基础、技术架构及其在处理序列数据挑战中的创新应用

一、为什么需要RNN 尽管神经网络被视为一种强大且理论上能够近似任何连续函数的模型&#xff0c;尤其当训练数据充足时&#xff0c;它们能够在输入空间中的某个点( x )映射到输出空间的特定值( y )&#xff0c;然而&#xff0c;这并不能完全解释为何在众多应用场景中&#xff…

基于Spring Boot的新生宿舍管理系统设计与开发

基于Spring Boot的新生宿舍管理系统设计与开发 开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/idea 系统部分展示 报修处理管理界面图&#xff0c;在报修处理管理页面…

QA测试开发工程师面试题满分问答16: 微信输入框如何设计测试用例?

可以涵盖基础功能、用户交互、编辑撤回、权限相关、网络信号、异常、并发性能和安全性等方面的测试用例&#xff1a; 基础功能&#xff1a; 验证输入框是否能够接收用户输入&#xff0c;并显示输入的文字。检查输入框是否支持常见的字符输入&#xff0c;如字母、数字、标点符号…

Unity Shader 流光 边缘光

前言 Unity2021.3.23 一、实现原理 Time控制UV的变化,再采样一张流光贴图.即可实现流光效果。 二、效果及源码展示 1.流光效果 效果描述: 1.边缘光(菲尼尔), 2.从上到下扫描光. 效果图如下: 代码如下&#xff1a; Shader "Unlit/ScanCode" {Properties{_MainTe…

【数据结构】树与二叉树、树与森林部分习题与算法设计例题

目录 【数据结构】树与二叉树部分习题与算法设计例题一、单选题二、算法设计题判断二叉树是否为完全二叉树求二叉树的最小深度 以及 二叉树树高 树与二叉树知识点文章: 【数据结构】树与二叉树&#xff08;递归法先序、中序、后序、层次遍历二叉树、二叉树的建立以及求树高的方…

必看——通配符SSL证书在线免费申请方法!

申请通配符SSL证书&#xff0c;就相当于给你的网站及所有子域名都戴上同一顶加密“帽子”&#xff0c;保护它们的安全通信。以下是三步搞定的方法&#xff1a; 第一步&#xff1a;找权威机构 就像你要找个官方认证的地方办证明一样&#xff0c;先选一家靠谱的证书颁发机构&…