从实例出发,深入探索Java SE中数组的易错点

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云;欢迎大家常来逛逛

  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。

  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!

前言

  在Java中,数组是非常常见的数据类型,它可以用来存储一组相同类型的数据。然而,由于数组的特殊性质,我们在使用它的时候也可能会遇到一些易错点,这些问题可能涉及到数组的初始化、遍历、越界等方面。在本文中,我们将通过一些实例来深入探讨Java SE中数组的易错点,希望能够帮助Java开发者更好地理解和使用数组。

摘要

  本文主要围绕Java SE中的数组展开讨论,从实例出发,深入探索数组的易错点。涉及的主要内容包括数组的初始化、遍历、越界等方面,我们将通过一些具体的代码实例来说明这些问题,并提供一些优缺点分析和应用场景案例。最后,我们还将提供一些类代码方法介绍和测试用例,帮助读者更好地理解和使用这些知识点。

正文

简介

  数组是一种非常重要的数据类型,它可以用来存储一组相同类型的数据。在Java中,数组也是常用的数据类型之一,Java中的数组可以是一维的、二维的、多维的等类型。同时,由于Java数组的特殊性质,我们在使用它的时候也可能会遇到一些易错点,这些问题可能涉及到数组的初始化、遍历、越界等方面。因此,了解Java SE中的数组易错点是非常重要的。

源代码解析

  在本节中,我们将通过一些具体的代码实例来说明Java SE中数组的易错点,主要包括数组的初始化、遍历、越界等方面。

数组的初始化

  在Java中,数组可以通过两种方式进行初始化,一种是静态初始化,一种是动态初始化。

// 静态初始化
int[] arr1 = {1, 2, 3, 4, 5};

// 动态初始化
int[] arr2 = new int[5];
arr2[0] = 1;
arr2[1] = 2;
arr2[2] = 3;
arr2[3] = 4;
arr2[4] = 5;

  在静态初始化中,我们在定义数组的同时就可以初始化它的元素。而在动态初始化中,我们需要先定义一个数组,然后再依次为每个元素赋值。需要注意的是,静态初始化和动态初始化不能同时使用。

代码分析:

  这段代码是关于Java数组的初始化的示例。其中,数组可以通过静态初始化和动态初始化两种方式进行。

静态初始化是指在创建数组对象的同时,为其元素赋值的方式。比如 int[] arr1 = {1, 2, 3, 4, 5}; 创建了一个包含5个元素的int类型数组arr1,并给其元素赋值为1、2、3、4和5。

动态初始化则是指在创建数组对象之后,通过索引为其元素赋值的方式。比如 int[] arr2 = new int[5]; 通过关键字new创建了一个包含5个元素的int类型数组arr2,而每个元素默认初始化为0。接着,对arr2数组的每个元素进行赋值,arr2[0] = 1; 表示把第一个元素赋值为1,arr2[1] = 2; 表示把第二个元素赋值为2,以此类推。

总之,数组的初始化方式取决于业务需求,可以根据不同的场景选择合适的方式来初始化数组。

数组的遍历

  在Java中,我们可以通过循环语句来遍历数组。

int[] arr = {1, 2, 3, 4, 5};
for (int i = 0; i < arr.length; i++) {
    System.out.println(arr[i]);
}

  这段代码中,我们使用了for循环来遍历了数组arr的所有元素,输出了它们的值。需要注意的是,在使用for循环遍历数组时,我们需要使用数组的length属性来获取数组的长度。

代码分析:

  上述代码是一个 Java 程序片段,它创建了一个整型数组 arr,包含了 1 到 5 五个元素。然后使用 for 循环遍历了该数组,将每个元素打印出来。

  具体来说,for 循环的初始化语句 i = 0 将变量 i 初始化为 0。循环条件 i < arr.length 表示只要 i 小于数组长度,就执行循环体。循环体里使用了 System.out.println() 方法将数组元素按顺序打印出来。在每次循环迭代时,i 将自增 1,直到 i 等于数组长度,for 循环结束。

  因此,上述代码的输出结果将是:

1
2
3
4
5

数组的越界

  在Java中,数组越界是一个非常容易出现的问题。当我们访问数组的时候,如果超出了数组的范围,就会抛出ArrayIndexOutOfBoundsException异常。

int[] arr = {1, 2, 3, 4, 5};
System.out.println(arr[5]); // 抛出ArrayIndexOutOfBoundsException异常

  在上面的代码中,由于数组arr的长度只有5,而我们却访问了它的第6个元素,就导致了数组越界的问题。因此,在使用数组的时候,我们需要非常注意数组的边界条件,避免出现越界问题。

代码分析:

  这段代码定义了一个名为arr的整型数组,其中包含了1到5这五个数。然后尝试打印数组中索引为5的元素,但是实际上数组的索引是从0开始的,因此arr[5]的访问超出了数组的范围,会抛出ArrayIndexOutOfBoundsException异常。

应用场景案例

  在本节中,我们将根据实际应用场景,提供一些数组的应用案例,以便读者更好地理解和应用数组。

案例1

  在Java中,我们可以使用数组来存储一组数据,并进行排序。下面的代码是一个使用数组进行排序的例子。

int[] arr = {5, 3, 1, 2, 4};
for (int i = 0; i < arr.length; i++) {
    for (int j = 0; j < arr.length - 1 - i; j++) {
        if (arr[j] > arr[j + 1]) {
            int tmp = arr[j];
            arr[j] = arr[j + 1];
            arr[j + 1] = tmp;
        }
    }
}
for (int i = 0; i < arr.length; i++) {
    System.out.println(arr[i]);
}

  在这个例子中,我们使用了冒泡排序算法对数组进行了排序。该算法的基本思想是,从数组的第一个元素开始,依次比较相邻的两个元素,如果前一个元素大于后一个元素,则交换它们的值。通过多次比较和交换,最终可以将数组排序。

代码分析:

  这段代码是一个冒泡排序算法的实现。它通过比较相邻两个元素的大小,如果前一个元素大于后一个元素,则交换它们的位置。这样每一趟比较都会将当前最大的元素交换到最后的位置。经过多次比较和交换,最终得到一个按照从小到大排列的数组。

具体解释如下:

  1. 定义一个数组arr,包含五个元素{5, 3, 1, 2, 4}。

  2. 第一个for循环:循环变量i从0开始,到arr数组的长度为止。每次循环,都会执行一次第二个for循环。

  3. 第二个for循环:循环变量j从0开始,到arr数组的长度-1-i为止。每次循环,都会比较两个相邻的元素的大小,如果前一个元素大于后一个元素,则交换它们的位置。

  4. 第二个for循环的循环次数随着i的增大而减小,因为每经过一次循环,数组的最后一个元素已经是当前最大的元素,不需要再对它进行比较。

  5. 第二个for循环的结束后,数组中最大的元素已经被交换到了最后的位置。

  6. 第一个for循环的结束后,整个数组按照从小到大的顺序排列好了。

  7. 最后一个for循环:循环变量i从0开始,到arr数组的长度为止。每次循环,都会输出数组中的元素。

案例2

  在Java中,我们可以使用数组来统计一些数据的出现次数。下面的代码是一个使用数组统计数据出现次数的例子。

int[] arr = {1, 2, 3, 4, 5, 2, 3, 4, 1, 2};
int[] count = new int[6];
for (int i = 0; i < arr.length; i++) {
    count[arr[i]]++;
}
for (int i = 1; i < count.length; i++) {
    System.out.println("数字" + i + "出现了" + count[i] + "次");
}

  在这个例子中,我们定义了一个长度为6的数组count,用来记录数字1到5的出现次数。通过遍历原始数组arr,我们可以依次将每个数字出现的次数记录在count数组中。最后,我们再遍历count数组,输出每个数字出现的次数。

代码分析:

  该段代码目的是统计一个给定整数数组中每个数字出现的次数。首先定义了一个给定整数数组 arr,然后创建了一个长度为 6(因为最大的数字是 5)的整型数组 count,然后使用 for 循环遍历整数数组 arr,对于每个数字,将count 数组中对应的数字位置加 1。最后再使用 for 循环遍历 count 数组,输出每个数字出现的次数。

  例如,对于给定整数数组 {1, 2, 3, 4, 5, 2, 3, 4, 1, 2},count 数组在遍历后的值为 {0, 2, 3, 2, 2, 1},表示数字 1 出现了 2 次,数字 2 出现了 3 次,数字 3 出现了 2 次,数字 4 出现了 2 次,数字 5 出现了 1 次。最后程序输出:

数字1出现了2次
数字2出现了3次
数字3出现了2次
数字4出现了2次
数字5出现了1次

优缺点分析

  在本节中,我们将对Java SE中数组的优缺点进行分析,以便读者更好地理解和应用数组。

优点

  • 数组可以用来存储一组相同类型的数据,方便读写。
  • 数组可以通过下标来访问元素,访问效率较高。
  • 数组支持动态扩容和缩容。

缺点

  • 数组的长度是固定的,无法动态改变数组的大小。
  • 数组中的元素必须是同一类型的,不支持不同类型的元素混合存储。
  • 数组的越界问题容易出现,需要特别注意。

类代码方法介绍

  在本节中,我们将提供一些Java SE中数组相关的类代码方法介绍,以便读者更好地理解和使用数组。

Arrays类

  Arrays类是Java SE中提供的用于操作数组的工具类,它包含了一些静态方法,可以方便地进行数组的操作。

// 将数组转换为字符串
public static String toString(int[] a)

// 对数组进行排序
public static void sort(int[] a)

// 对数组进行二分查找
public static int binarySearch(int[] a, int key)

代码分析:

  这三个方法都是Java中Arrays类提供的静态方法,用于操作int类型的数组:

  1. toString方法将int数组转换为字符串,并返回该字符串。例如:
int[] arr = {1, 2, 3, 4, 5};
String str = Arrays.toString(arr); // str = "[1, 2, 3, 4, 5]"
  1. sort方法对int数组进行排序。它使用的是快速排序算法,时间复杂度为O(nlogn)。例如:
int[] arr = {5, 3, 1, 2, 4};
Arrays.sort(arr); // arr = {1, 2, 3, 4, 5}
  1. binarySearch方法对已排序的int数组进行二分查找,如果找到指定key值,则返回其下标;否则返回负数。例如:
int[] arr = {1, 2, 3, 4, 5};
int result = Arrays.binarySearch(arr, 3); // result = 2
result = Arrays.binarySearch(arr, 6); // result = -6(负数表示没找到)

需要注意的是,该方法要求传入的数组必须先进行排序才能进行二分查找。

System类

  System类是Java SE中提供的一个用于与系统进行交互的工具类,它包含了一些静态方法,可以在控制台输出信息。

// 将数组打印到控制台
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)

代码分析:

  该代码中的arraycopy方法是Java中的数组复制方法,其参数含义如下:

  • src:源数组
  • srcPos:源数组的起始位置
  • dest:目标数组
  • destPos:目标数组的起始位置
  • length:要复制的数组元素的数量

  该方法的作用是将源数组从指定位置开始的length个元素复制到目标数组的指定位置开始的length个位置上。如果目标数组比源数组小,则只会复制部分元素;如果目标数组比源数组大,则会先将目标数组中的元素全部清空,然后再复制源数组的元素。

  该方法在控制台上并不会直接打印数组,而是用于将一个数组中的元素复制到另一个数组中。如果需要打印数组到控制台,可以使用Java中的Arrays类的toString()方法。

测试用例

在本节中,我们提供一些测试用例,以便读者更好地理解和运用本文中所述测试用例:

package com.example.javase.se.array;

import java.util.Arrays;

/**
 * @Author ms
 * @Date 2023-11-14 21:11
 */
public class ArrayTest10 {

    public static void main(String[] args) {
        // 静态初始化数组
        int[] arr1 = {3, 2, 1};
        System.out.println(Arrays.toString(arr1));

        // 动态初始化数组
        int[] arr2 = new int[5];
        for (int i = 0; i < arr2.length; i++) {
            arr2[i] = i + 1;
        }
        System.out.println(Arrays.toString(arr2));

        // 遍历数组
        int[] arr3 = {1, 2, 3, 4, 5};
        for (int i = 0; i < arr3.length; i++) {
            System.out.println(arr3[i]);
        }

        // 数组排序
        int[] arr4 = {5, 3, 1, 2, 4};
        Arrays.sort(arr4);
        System.out.println(Arrays.toString(arr4));

        // 数组的越界
        int[] arr5 = {1, 2, 3, 4, 5};
        try {
            System.out.println(arr5[5]); // 访问越界元素
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("数组越界");
        }

        // 统计数组中数字出现次数
        int[] arr6 = {1, 2, 3, 4, 5, 2, 3, 4, 1, 2};
        int[] count = new int[6];
        for (int i = 0; i < arr6.length; i++) {
            count[arr6[i]]++;
        }
        for (int i = 1; i < count.length; i++) {
            System.out.println("数字" + i + "出现了" + count[i] + "次");
        }
    }
}

预期输出结果如下:

[3, 2, 1]
[1, 2, 3, 4, 5]
1
2
3
4
5
[1, 2, 3, 4, 5]
数组越界
数字1出现了2次
数字2出现了3次
数字3出现了2次
数字4出现了2次
数字5出现了1次

测试结果

  根据如上测试用例,本地测试结果如下,仅供参考,你们也可以自行修改测试用例或者添加更多的测试数据或测试方法,进行熟练学习以此加深理解。

测试代码分析

  根据如上测试用例,在此我给大家进行深入详细的解读一下测试代码,以便于更多的同学能够理解并加深印象。
  该代码演示了Java中数组的基本操作,分别包括静态初始化数组、动态初始化数组、遍历数组、数组排序、数组越界和统计数组中数字出现次数。

  1. 静态初始化数组
    定义了一个数组arr1,并通过静态初始化的方式在声明时直接为其赋值,值为{3, 2, 1}。

  2. 动态初始化数组
    定义了一个数组arr2,并通过动态初始化的方式在声明时指定数组长度为5,然后通过循环为数组arr2中每个元素赋值。

  3. 遍历数组
    定义了一个数组arr3,并通过for循环遍历数组,打印出数组中每个元素的值。

  4. 数组排序
    定义了一个数组arr4,并通过Arrays.sort()对数组进行排序,然后通过Arrays.toString()方法将数组转换成字符串进行输出。

  5. 数组的越界
    定义了一个数组arr5,并尝试访问数组中越界的元素arr5[5],由于数组长度为5,访问的下标为5,超过了数组的长度范围,抛出了ArrayIndexOutOfBoundsException异常。

  6. 统计数组中数字出现次数
    定义了一个数组arr6,并定义了一个长度为6的count数组,用于保存数字出现的次数。通过for循环将arr6中每个数字出现的次数记录在count数组中,最后再次通过for循环遍历count数组,输出每个数字出现的次数。

小结

  本文针对Java SE中数组的易错点进行了深入探讨,并提供了一些实例、应用场景案例、优缺点分析、类代码方法介绍和测试用例,希望能够帮助Java开发者更好地理解和使用数组。在本文中,我们从静态初始化、动态初始化、遍历、越界等多个方面阐述了Java数组的易错点,并提供了一些优缺点分析和应用场景案例。此外,我们还介绍了一些Java SE中数组相关的类代码方法,并提供了一些测试用例来帮助读者更好地理解和运用本文所述内容。总之,通过本文的学习,希望读者能够掌握Java中的数组相关知识,并能够在实际开发中运用自如,达到事半功倍的效果。

总结

  本文主要介绍了Java SE中数组的易错点,主要包括数组的初始化、遍历、越界等方面。通过具体的代码实例,深入探讨了数组的特殊性质和注意点,并提供了一些优缺点分析和应用场景案例。此外,还介绍了一些Java SE中数组相关的类代码方法和测试用例,帮助读者更好地理解和运用本文中所述的内容。

  总的来说,Java SE中的数组是非常常见和重要的数据类型,但也存在一些易错点,需要特别注意。通过本文的学习,读者可以更好地理解和使用Java SE中的数组。

… …

文末

好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。

… …

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!


⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。

⭐️若有疑问,就请评论留言告诉我叭。

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

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

相关文章

神经网络模型---AlexNet

一、AlexNet 1.导入tensorflow库&#xff0c;这里给简称为tf库 import tensorflow as tf from tensorflow.keras import datasets, layers, modelsdatasets&#xff1a;是用于训练和测试机器学习模型的数据集合 layers&#xff1a;是构建神经网络模型的关键组成部分 models&a…

豆包高质量声音有望复现-Seed-TTS

我们介绍了 Seed-TTS&#xff0c;这是一个大规模自回归文本转语音 &#xff08;TTS&#xff09; 模型系列&#xff0c;能够生成与人类语音几乎没有区别的语音。Seed-TTS 作为语音生成的基础模型&#xff0c;在语音上下文学习方面表现出色&#xff0c;在说话人的相似性和自然性方…

摄像头图像矫正的表格生成方法

1.设置单元格高宽 点击表格左上角 的 小三角 列宽: HOME -> Rows and Columns -> Column Width 5 CM 行高: HOME -> Rows and Columns -> Row Height 5 CM 2.设置 条件格式 HOME -> Conditional Formatting-> Manager Rules 点击 左上方 New Rule…

win11右键小工具

开头要说的 在日常使用场景中&#xff0c;大家如果用的是新的笔记本电脑&#xff0c;应该都是安装的win11系统&#xff0c; 当然win11系统是最被诟病的&#xff0c; 因为有很多人觉得很难操作&#xff0c; 就比如一个小小的解压操作&#xff0c; 在win7和win10上&#xff…

gitlab 身份验证手机号验证没86

处理方案 在浏览器中摁 【F12】打开控制台&#xff0c;选择网络模块&#xff0c;找到手机号列表的请求&#xff0c;请求是 https://gitlab.com/-/countries&#xff0c;右击数据区域点击【替换内容】如下&#xff1a; ![在这里插入图片描述](https://img-blog.csdnimg.cn/di…

gRPC(Google Remote Procedure Call Protocol)谷歌远程过程调用协议

文章目录 1、gRPC简介2、gRPC核心的设计思路3、gPRC与protobuf关系 1、gRPC简介 gPRC是由google开源的一个高性能的RPC框架。Stubby Google内部的RPC&#xff0c;演化而来的&#xff0c;2015年正式开源。云原生时代是一个RPC标准。 2、gRPC核心的设计思路 网络通信 ---> gPR…

API-声明变量const优先

学习目标&#xff1a; 掌握声明变量const优先 学习内容&#xff1a; 变量声明总结 变量声明&#xff1a; 变量声明有三个var let const。 首先var排除&#xff0c;老派写法&#xff0c;问题很多&#xff0c;可以淘汰掉… 建议&#xff1a;const优先&#xff0c;尽量使用cons…

amr文件怎么转换成mp3?超好用的四种转换方法介绍!

amr文件怎么转换成mp3&#xff1f;在当今数字化时代&#xff0c;音频格式的多样性给我们带来了更广泛的选择&#xff0c;其中AMR格式就是其中之一&#xff0c;AMR格式在录音和通话领域得到广泛应用&#xff0c;但与此同时&#xff0c;它也存在一些挑战和局限性&#xff0c;尽管…

推荐常用的三款源代码防泄密软件

三款源代码防泄密软件——安秉源代码加密、Virbox Protector 和 MapoLicensor——确实各自在源代码保护的不同方面有其专长。这些软件可以满足企业对于源代码保护的三大需求&#xff1a;防止泄露、防止反编译和防止破解。 安秉源代码加密&#xff1a; 专注于源代码文件的加密&…

安卓Context上下文

目录 前言一、Context简介二、Application Context2.1 Application Context的创建过程2.2 Application Context的获取过程 三、Activity的Context创建过程四、Service的Context创建过程 前言 Context也就是上下文对象&#xff0c;是Android较为常用的类&#xff0c;但是对于Co…

C++ 70 之 类模版中的成员函数,在类外实现

#include <iostream> #include <string> using namespace std;template<class T1, class T2> class Students10{ public:T1 m_name;T2 m_age;Students10(T1 name, T2 age); // 类内声明 类外实现// {// this->m_name name;// this->m_age …

【PPT设计前沿】2024年PPT新趋势,让你的演示文稿引领潮流!

文章目录 一、简约风格的新诠释二、动态元素与交互性的深度融合三、个性化与定制化的独特展现四、大数据与可视化的创新应用五、绿色环保与可持续性的倡导《PPT完美设计入门与进阶/入门与进阶》图书特色内容简介目录前言/序言 获取方式 随着技术的不断革新和创意设计的蓬勃发展…

技术分析:开源大模型的兴起与热门项目推荐

技术分析&#xff1a;开源大模型的兴起与热门项目推荐 引言 随着人工智能&#xff08;AI&#xff09;技术的不断发展&#xff0c;开源大模型成为了许多程序员和研究人员关注的焦点。开源项目不仅促进了技术的快速迭代和普及&#xff0c;还为更多的人提供了学习和实践的机会。…

提取人脸——OpenCV

提取人脸 导入所需的库创建窗口显示原始图片显示检测到的人脸创建全局变量定义字体对象定义一个函数select_image定义了extract_faces函数设置按钮运行GUI主循环运行显示 导入所需的库 tkinter&#xff1a;用于创建图形用户界面。 filedialog&#xff1a;用于打开文件对话框。 …

PR软件视频抠图换背景

1 新建项目 2 新建序列 在项目的右下角有个图标&#xff0c;新建 序列 序列是视频的制作尺寸&#xff0c;根据自己的需要选择 3 新建颜色遮罩 在项目的右下角--新建颜色遮罩--选择黑色--确定 4 导入视频 把要导入视频的文件夹打开&#xff0c;把视频拖到 项目 里 把黑色遮罩拖…

苹果电脑下载vite包错

苹果电脑下载vite包错/Users/lili/.npm/_cacache/index-v5/c5/50/b451703d03b3802b9ee6b7ff2b0bde4de7f26830eb52c904d6911c137cf8包错解决方式 解决方式&#xff1a;sudo chown -R 501:20 "/Users/wangxin/.npm"

python连接数据库,相关数据处理

随机生成一千个数据插入large_db中 # 这是一个示例 Python 脚本。# 按 ShiftF10 执行或将其替换为您的代码。 # 按 双击 Shift 在所有地方搜索类、文件、工具窗口、操作和设置。 import pandas as pd from sqlalchemy import create_engine from faker import Faker# 初始化fa…

MySQL日志——redolog

redo log&#xff08;重做日志&#xff09; 为什么需要redo log&#xff1f; 在mysql提交一个事务后&#xff0c;这个事务所作的数据修改并不会直接保存到磁盘文件中&#xff0c;而是先保存在buffer pool缓冲区中&#xff0c;在需要读取数据时&#xff0c;先从缓冲区中找&…

图片怎么弄成黑白的?关于将图片改成黑白的几种方法

图片怎么弄成黑白的&#xff1f;黑白照片以其独特的艺术魅力和经典的视觉效果&#xff0c;依然在摄影和图像处理中占据重要地位。无论是为了追求怀旧的氛围&#xff0c;还是为了突出图像的构图和光影效果&#xff0c;许多人都希望将彩色图片转换成黑白图片。这不仅可以赋予图像…

Springboot 权限认证框架 -- SA-Token 简介(一)

引言 现今的软件开发中&#xff0c;权限认证与访问控制是每一个应用都必不可少的功能。SA-Token是一个简单、安全、易用的权限认证框架&#xff0c;它主要解决登录认证、权限认证、Session会话、单点登录等功能。SA-Token以其轻量级、零学习成本的特点&#xff0c;迅速赢得了开…