当前位置: 首页 > news >正文

Java数组,简简单单信手沾来~

——数组,一组相同数据类型的数据

一.一维数组

1.数组的基本概念 

1)数组用于存储多个同一数据类型的数据

2)数组是数据类型【引用类型

3)数组的形式:数据类型 + []

4)数组的下标从0开始

5)数组中的元素是通过下标进行访问的

6)数组的长度:数组名.length()

 

2. 一个小case快速了解数组

public class Test {public static void main(String[] args) {int[] arr1 = {1,2,3,4,5,6};//整型数组:只能存储整型数据//double[] arr2 = {1.2,2.3,3.45,5.6};//浮点数组:只能储存浮点型数据//char[] arr3 = {'a','b','c','d'.'e'};//字符数组:只能储存字符型数据//通过[]中的下标来访问数组System.out.println(arr1[0]);//访问第一个元素System.out.println(arr1[1]);//访问第二个元素System.out.println(arr1[2]);//求数组的长度:数组名.lengthSystem.out.println(arr1.length);//6}
}

 

3.数组的使用

1)初始化方式1:数据类型[ ] 数组名 = new 数据类型[大小];

public class Test {public static void main(String[] args) {//动态定义double数组,并且数组的大小为5double[] arr = new double[5];Scanner sc = new Scanner(System.in);//输入数据int i = 0;for(i=0;i<arr.length;i++)arr[i] = sc.nextDouble();//打印数据for(i=0;i<arr.length;i++)System.out.println(arr[i]);}
}

2)初始化方式2:数据类型[ ] 数组名 = {元素值1,元素值2,元素值3……} 

public class Test {public static void main(String[] args) {//静态初始化数组int[] arr = {1,2,3,4,5,6};//打印数组中的数据int i = 0;for(i=0;i<arr.length;i++) {System.out.println(arr[i]);}}
}

 

4.数组的使用细节

1)数组是一组相同数据类型的组合

2)数组的数据类型一旦确定,不可改变

public class Test {public static void main(String[] args) {//数组是一组相同数据类型的组合int[] arr = {1,2,3,4,5,6};//全部是整型数据//数组的数据类型一旦确定,不可改变//int[] str = {1,2,3.4,6,6};//错误,整型数组只能储存整型数据,3.4是浮点型数据//int[] str = {'a',1,2,3};//错误,整型数组只能储存整型数据,'a'是字符}
}

3)数组创建后,若数据元素无赋值,则有默认值 

int / short / byte / long : 0
float / double : 0.0    
char:'\u0000'        
boolean : false        
String : null
引用类型: null

4)数组的使用步骤

        a.声明数组并开辟空间

        b.给数组的各个元素赋值

        c.使用数组

public class Test {public static void main(String[] args) {Scanner sc = new Scanner(System.in);//i.声明数组并开辟空间int[] arr = new int[5];//ii.给数组的各个元素赋值arr[0] = 1;//直接赋值arr[1] = 2;arr[2] = sc.nextInt();//输入赋值arr[3] = sc.nextInt();//输入赋值arr[4] = 5;//iii.使用数组int i = 0;for(i=0;i<arr.length;i++)System.out.println(arr[i]);}
}

5)数组的下标是从0开始

6)数组的下标必须在指定范围内使用,否则出现:下标越界异常

7)数组属于引用类型,数组型数据是对象

public class Test {public static void main(String[] args) {int[] arr = {1,2,3,4,5};//数组的下标是从0开始System.out.println(arr[0]);//数组的下标必须在指定范围内使用,否则报错:下标越界异常//arr[6] = 0;//ArrayIndexOutOfBoundsException//7)数组属于引用类型,数组型数据是对象System.out.println(arr);//打印出arr数组的地址}
}

 

5.数组赋值

1)基本数据类型赋值,使用变量存储要存储的值即可

public class Test {public static void main(String[] args) {int a = 10;int b = a;//把a的值赋给bSystem.out.println(b);//10}
}

 2)数组之间的赋值是把数组的地址复制过来

public class Test {public static void main(String[] args) {int[] arr = {1,2,3,4,5,6,7};int[] arr1 = arr;//把arr的地址赋给arr1//两者地址(hashcode)相同System.out.println(arr);//[I@4eec7777System.out.println(arr1);//[I@4eec7777arr1[0] = 10;//对数组中值的修改会使指向这个数组的另外一个数组的值也随着改变System.out.println(arr[0]);//10System.out.println(arr1[0]);//10}
}

 

6.数组拷贝

把一个数组的内容复制到另一个数组 

public class Test {public static void main(String[] args) {int[] arr = {1,2,3,4,5,6,7};int[] str = new int[arr.length];int i = 0;for(i=0;i<arr.length;i++) {str[i] = arr[i];}for(i=0;i<arr.length;i++) {System.out.print(str[i] + " "); // 1 2 3 4 5 6 7}}
}

 

7.数组扩容

当数组的空间不够时,对数组进行动态扩容

注:底层使用Arrays.copyOf()方法进行扩容

import java.util.Scanner;public class Test {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int[] arr = {1,2,3,4,5,6,7};char ch = '0';do {int[] str = new int[arr.length + 1];//进行扩容int i = 0;for(i=0;i<arr.length;i++) {str[i] = arr[i];}System.out.println("请输入要添加的数据:");str[arr.length] = sc.nextInt();arr = str;for(i=0;i<arr.length;i++) {System.out.print(arr[i] + " ");}System.out.println();//换行System.out.println("是否要继续添加数据(y/n):");ch = sc.next().charAt(0);if(ch == 'n')break;}while(true);}
}

 

 

二.二维数组

1.二维数组的基本概念

1)概念:二维数组本质上是以数组作为数组元素的数组,即“数组的数组”

2)定义形式:数据类型[常量表达式][常量表达式] 数组名;

 

2.一个小case让你快速了解二维数组

public class Test {public static void main(String[] args) {int[][] arr = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};System.out.println("二维数组的元素个数为:" + arr.length);//3,即3个一维数组//遍历二维数组//arr.length --> 二维数组中的第一维(行)的长度//arr[i].length --> 二维数组中第二维(列)的长度int i,j;for(i=0;i<arr.length;i++) {//二维数组的元素个数for(j=0;j<arr[i].length;j++) {//一维数组的元素个数//进行遍历输出System.out.print(arr[i][j] + " ");//1 2 3 4 5 6 7 8 9 10 11 12 }}}
}

 

3.二维数组的使用

初始化方式1:数据类型[ ][ ] 数组名 = new 数据类型[大小][大小];

import java.util.Scanner;public class Test {public static void main(String[] args) {//初始化方式1:数组中的值都是默认值0,需要我们输入值在数组中去int[][] arr = new int[3][5];//System.out.println(arr[0][0]);//0Scanner sc = new Scanner(System.in);for (int i = 0; i < arr.length; i++) {for (int j = 0; j < arr[i].length; j++) {arr[i][j] = sc.nextInt();//输入数据}}//输出数据//arr.length --> 二维数组中的第一维(行)的长度//arr[i].length --> 二维数组中第二维(列)的长度for (int i = 0; i < arr.length; i++) {for (int j = 0; j < arr[i].length; j++) {System.out.print(arr[i][j] + " ");}}}
}

初始化方式2:列数不确定

import java.util.Scanner;public class Test {public static void main(String[] args) {//动态初始化:数组中的值都是默认值0,需要我们输入值在数组中去int[][] arr = new int[3][];//System.out.println(arr[0][0]);//0arr[0] = new int[1];//使用二维数组的第一维的第1个元素给二维数组的第二维开辟1个整型空间arr[1] = new int[2];//使用二维数组的第一维的第2个元素给二维数组的第二维开辟2个整型空间arr[2] = new int[3];//使用二维数组的第一维的第3个元素给二维数组的第二维开辟3个整型空间Scanner sc = new Scanner(System.in);//输入数据for (int i = 0; i < arr.length; i++) {for (int j = 0; j < arr[i].length; j++) {arr[i][j] = sc.nextInt();}}//输出数据//arr.length --> 二维数组中的第一维(行)的长度//arr[i].length --> 二维数组中第二维(列)的长度for (int i = 0; i < arr.length; i++) {for (int j = 0; j < arr[i].length; j++) {System.out.print(arr[i][j] + " ");}}}
}

初始化方式3:数据类型[ ][ ] 数组名 =

{

{数据值1,数据值2……},  {数据值1,数据值2……},  {数据值1,数据值2……}

……}

public class Test {public static void main(String[] args) {//初始化方式3//数据类型[][] 数组名 = {{数据值1,数据值2……},{数据值1,数据值2……},{数据值1,数据值2……}……}int[][] arr = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};//3行4列//遍历arr中的值//arr.length --> 二维数组中的第一维(行)的长度//arr[i].length --> 二维数组中第二维(列)的长度for (int i = 0; i < arr.length; i++) {for (int j = 0; j < arr[i].length; j++) {System.out.print(arr[i][j] + " ");}}}
}

 

4.二维数组的细节讨论

 1)二维数组的声明方式:int[ ][ ] arr 或 int[ ] arr[ ] 或 int arr[ ][ ]

//二维数组的声明方式:int[ ][ ] arr 或 int[ ] arr[ ] 或 int arr[ ][ ]
//int arr[][] = new int[3][5];//声明方式1:C语言的声明类型
//int[] arr[] = new int[3][5];//声明方式2
int[][] arr = new int[3][5];//声明方式3:Java最常用的声明方式

2)二维数组实际上是由多个一维数组组成的,它的各个一维数组的长度可相同,也可不同 

public class Test {public static void main(String[] args) {//两个一维数组的长度不相同:第一个长度是2,第二个长度是4int[][] arr = {{1, 2}, {1, 3, 4, 5}};//遍历输出for (int i = 0; i < arr.length; i++) {for (int j = 0; j < arr[i].length; j++) {System.out.print(arr[i][j] + " ");}}}
}

 

5.杨辉三角

1)第一个元素和最后一个元素均是1

2)中间元素均是上一行元素左右元素的和

public class Test {public static void main(String[] args) {int[][] tangle = new int[12][];for (int i = 0; i < tangle.length; i++) {tangle[i] = new int[i + 1];//开辟空间for (int j = 0; j < tangle[i].length; j++) {if (j == 0 || j == tangle[i].length - 1) {tangle[i][j] = 1;} else {tangle[i][j] = tangle[i - 1][j] + tangle[i - 1][j - 1];//中间元素}}}//输出杨辉三角for (int i = 0; i < tangle.length; i++) {for (int j = 0; j < tangle[i].length; j++) {System.out.print(tangle[i][j]);}System.out.println();//换行}}
}

 

 

三.基本排序 

1.冒泡排序

1)思想:对待排序数组进行从前向后的依次比较相邻元素的值,如果发现有逆序的数则进行交换,使值较大的/较小的逐渐从前向后移动。

2)时间复杂度:O(n^2)

import java.util.Scanner;public class Test {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int[] arr = new int[6];int i = 0;for(i=0;i<arr.length;i++)arr[i] = sc.nextInt();bubbleSort(arr);//进行冒泡排序for(i=0;i<arr.length;i++) {System.out.print(arr[i] + " ");}}/*** 冒泡排序实现*/public static void bubbleSort(int[] arr) {int i,j;for(i=0;i<arr.length - 1;i++) {for(j=0;j < arr.length - i - 1;j++) {//进行比较交换if(arr[j] > arr[j+1]) {int temp = arr[j];//临时变量帮助交换arr[j] = arr[j+1];arr[j+1] = temp;}}}}
}

 

 

 四.基本查找 

 1.顺序查找

1)思想:从给定的一组数据找查找待查找的数据,判断这组数据中是否存在这个待查找的数据

2)时间复杂度:O(n)

import java.util.Scanner;public class Test {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int[] arr = {1,2,3,4,5,6,7,8,9,10};int searchData = 7;//待查找值int res = find(arr,searchData);//顺序查找if(res == 0)System.out.println("要查找的值" + searchData + "不存在");elseSystem.out.println("要查找值的下标是:" + res);}/*** 顺序查找* @param arr* @param searchData* @return 数组下标*/public static int find(int[] arr, int searchData) {int i = 0;for(i=0;i<arr.length;i++) {//进行比较if(arr[i] == searchData)return i;}return 0;}
}

 

2.二分查找

1)思想:从有序的数据中,查找目标值,每次取有序数据的一半,然后和目标值进行比较,若大于,则往左边的找,若小于,则往右边找;往复循环,一直到找不到或找到情况

2)时间复杂度:O(logN)

import java.util.Scanner;public class Test {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int[] arr = {1,2,3,4,5,6,7,8,9,10};//有序数组int searchData = 7;//待查找值int res = binarySearch(arr,searchData);//二分查找if(res == 0)System.out.println("要查找的值" + searchData + "不存在");elseSystem.out.println("要查找值的下标是:" + res);}public static int binarySearch(int[] arr, int searchData) {int left = 0;int right = arr.length - 1;while(left <= right) {//每次mid都要在查找范围的中间int mid = left + (right - left) / 2;//进行比较if(arr[mid] > searchData) {right = mid - 1;} else if(arr[mid] < searchData) {left = mid + 1;} else {return mid;//返回下标}}return 0;//没有查找到}
}

相关文章:

Java数组,简简单单信手沾来~

——数组&#xff0c;一组相同数据类型的数据 一.一维数组 1.数组的基本概念 1&#xff09;数组用于存储多个同一数据类型的数据 2&#xff09;数组是数据类型【引用类型】 3&#xff09;数组的形式&#xff1a;数据类型 [] 4&#xff09;数组的下标从0开始 5&#xff09;数…...

认识SourceTree

一. SourceTree是什么 SourceTree是一款免费的Git和Mercurial版本控制系统&#xff0c;它可以帮助开发人员在一个友好的UI界面中管理代码&#xff0c;方便地进行版本控制和代码同步。支持创建、克隆、提交、push、pull 和合并等操作。 二. SourceTree的安装破解 1. 如果你还…...

python之列表推导式

列表推导式是一种简洁的方式来创建列表。它允许您通过在单个表达式中定义循环和条件逻辑&#xff0c;以一种更紧凑的方式生成新的列表。使用列表推导式可以使代码更简洁&#xff0c;易于阅读&#xff0c;并且通常比传统的迭代方法更快。 列表推导式的一般语法形式为&#xff1a…...

selenium自动化测试之搭建测试环境

自动化测试环境&#xff1a; Python3.7Selenium3.141谷歌浏览器76.0/火狐浏览器 1、安装Python并配置环境变量。 下载并安装&#xff1a;配置环境变量&#xff1a;C:\Python37;C:\Python37\Scripts; 2、安装Pycharm开发工具。 下载地址&#xff1a; 注意下载&#xff1a;Co…...

模拟实现消息队列(以 RabbitMQ 为蓝本)

目录 1. 需求分析1.1 介绍一些核心概念核心概念1核心概念2 1.2 消息队列服务器&#xff08;Broker Server&#xff09;要提供的核心 API1.3 交换机类型1.3.1 类型介绍1.3.2 转发规则&#xff1a; 1.4 持久化1.5 关于网络通信1.5.1 客户端与服务器提供的对应方法1.5.2 客户端额外…...

WordPress更换域名后-后台无法进入,网站模版错乱,css失效,网页中图片不显示。完整解决方案(含宝塔设置)

我在实际解决问题时用到了 【简单暴力解决方案】的《方法一:修改wp-config.php》 和 【简单暴力-且特别粗暴-的解决方案】 更换域名时经常遇到的几个问题: 1、更换域名后,后台无法进入 2、更换域名后,网站模版错乱,css失效 3、更换域名后,网页中图片不显示 这是为什…...

无法正确识别车牌(Python、OpenCv、Tesseract)

我正在尝试识别车牌&#xff0c;但出现了错误&#xff0c;例如错误/未读取字符 以下是每个步骤的可视化&#xff1a; 从颜色阈值变形关闭获得遮罩 以绿色突出显示的车牌轮廓过滤器 将板轮廓粘贴到空白遮罩上 Tesseract OCR的预期结果 BP 1309 GD 但我得到的结果是 BP 1309…...

VSCODE[配置ssh免密远程登录]

配置ssh免密远程登录 本文摘录于&#xff1a;https://blog.csdn.net/qq_44571245/article/details/123031276只是做学习备份之用&#xff0c;绝无抄袭之意&#xff0c;有疑惑请联系本人&#xff01; 这里要注意如下几个地方: 1.要进入.ssh目录创建文件: 2.是拷贝带"ssh-…...

Multi-object navigation in real environments using hybrid policies 论文阅读

论文信息 题目&#xff1a;Multi-object navigation in real environments using hybrid policies 作者&#xff1a;Assem Sadek, Guillaume Bono 来源&#xff1a;CVPR 时间&#xff1a;2023 Abstract 机器人技术中的导航问题通常是通过 SLAM 和规划的结合来解决的。 最近…...

初始多线程

目录 认识线程 线程是什么&#xff1a; 线程与进程的区别 Java中的线程和操作系统线程的关系 创建线程 继承Thread类 实现Runnable接口 其他变形 Thread类及其常见方法 Thread的常见构造方法 Thread类的几个常见属性 Thread类常用的方法 启动一个线程-start() 中断…...

论坛项目day3|开发社区首页

在典型的基于层次结构的软件架构中&#xff0c;特别是在使用MVC&#xff08;模型-视图-控制器&#xff09;设计模式的情况下&#xff0c;Controller、Service、DAO&#xff08;数据访问对象&#xff09;和Entity通常扮演着不同的角色&#xff0c;并且它们之间有清晰定义的关系。…...

Server - 文字转语音 (Text to Speech) 的在线服务 TTSMaker

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/132287193 TTSMaker 是一款免费的文本转语音工具&#xff0c;提供语音合成服务&#xff0c;支持多种语言&#xff0c;包括英语、法语、德语、西班…...

Python学习笔记_基础篇_数据类型之字符串

一.基本数据类型 整数&#xff1a;int 字符串&#xff1a;str(注&#xff1a;\t等于一个tab键) 布尔值&#xff1a; bool 列表&#xff1a;list 列表用[] 元祖&#xff1a;tuple 元祖用&#xff08;&#xff09; 字典&#xff1a;dict 注&#xff1a;所有的数据类型都存在想对应…...

(二分查找) 11. 旋转数组的最小数字 ——【Leetcode每日一题】

❓剑指 Offer 11. 旋转数组的最小数字 难度&#xff1a;简单 把一个数组最开始的若干个元素搬到数组的末尾&#xff0c;我们称之为数组的旋转。 给你一个可能存在 重复 元素值的数组 numbers &#xff0c;它原来是一个升序排列的数组&#xff0c;并按上述情形进行了一次旋转…...

docker 制作tomcat镜像

需要下载tomcat安装包和jdk安装包&#xff0c;我这边下载的jdk版本分别为&#xff08;jdk和tomcat版本需要对应上&#xff09; apache-tomcat-9.0.78.tar.gzjdk-8u381-linux-x64.tar.gz创建一个readme.txt空文件 readme.txt创建一个Dockerfile文件 # centos系统作为底层 FROM …...

年之年的选择,组装版

组件&#xff1a;<!--* Author: liuyu liuyuxizhengtech.com* Date: 2023-02-01 16:57:27* LastEditors: wangping wangpingxizhengtech.com* LastEditTime: 2023-06-30 17:25:14* Description: 时间选择年 - 年 --> <template><div class"year-range-pick…...

英语词法——代词

代词是用来代替名词、起名词作用的短语、分句和句子的词。英语中代词根据其意义和作用可分为九类:人称代词、物主代词、反身代词、相互代词、指示代词、疑问代词、不定代词、关系代词和连接代词。 第一节 人称代词 一、人称代词的形式和用法 人称代词单数复数第一人称第二人…...

1475.商品折扣后的最终价格

文章目录 题目描述解题思路&#xff1a;方法一&#xff1a;通俗解法方法二&#xff1a;单调栈 leetcode原题链接 1475. 商品折扣后的最终价格 题目描述 给你一个数组 prices &#xff0c;其中 prices[i] 是商店里第 i 件商品的价格。 商店里正在进行促销活动&#xff0c;如果你…...

php、 go 语言怎么结合构建高性能高并发商城。

一、php、 go 语言怎么结合构建高性能高并发商城。 将PHP和Go语言结合起来构建高性能高并发的商城系统可以通过多种方法实现&#xff0c;以利用两种语言的优势。下面是一些可能的方法和策略&#xff1a; 1. **微服务架构&#xff1a;** 使用微服务架构&#xff0c;将系统拆分…...

ubuntu 部署 ChatGLM-6B 完整流程 模型量化 Nvidia

ubuntu 部署 ChatGLM-6B 完整流程 模型量化 Nvidia 初环境与设备环境准备克隆模型代码部署 ChatGLM-6B完整代码 ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型&#xff0c;基于 General Language Model (GLM) 架构&#xff0c;具有 62 亿参数。结合模型量化技术&#x…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题&#xff1a;CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者&#xff1a;Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列&#xff0c;以便知晓哪些列包含有价值的数据&#xff0c;…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖

在Vuzix M400 AR智能眼镜的助力下&#xff0c;卢森堡罗伯特舒曼医院&#xff08;the Robert Schuman Hospitals, HRS&#xff09;凭借在无菌制剂生产流程中引入增强现实技术&#xff08;AR&#xff09;创新项目&#xff0c;荣获了2024年6月7日由卢森堡医院药剂师协会&#xff0…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

深入浅出Diffusion模型:从原理到实践的全方位教程

I. 引言&#xff1a;生成式AI的黎明 – Diffusion模型是什么&#xff1f; 近年来&#xff0c;生成式人工智能&#xff08;Generative AI&#xff09;领域取得了爆炸性的进展&#xff0c;模型能够根据简单的文本提示创作出逼真的图像、连贯的文本&#xff0c;乃至更多令人惊叹的…...

API网关Kong的鉴权与限流:高并发场景下的核心实践

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言 在微服务架构中&#xff0c;API网关承担着流量调度、安全防护和协议转换的核心职责。作为云原生时代的代表性网关&#xff0c;Kong凭借其插件化架构…...

小木的算法日记-多叉树的递归/层序遍历

&#x1f332; 从二叉树到森林&#xff1a;一文彻底搞懂多叉树遍历的艺术 &#x1f680; 引言 你好&#xff0c;未来的算法大神&#xff01; 在数据结构的世界里&#xff0c;“树”无疑是最核心、最迷人的概念之一。我们中的大多数人都是从 二叉树 开始入门的&#xff0c;它…...