当前位置: 首页 > 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…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&qu…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行

项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战&#xff0c;克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

无人机侦测与反制技术的进展与应用

国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机&#xff08;无人驾驶飞行器&#xff0c;UAV&#xff09;技术的快速发展&#xff0c;其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统&#xff0c;无人机的“黑飞”&…...

uniapp手机号一键登录保姆级教程(包含前端和后端)

目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号&#xff08;第三种&#xff09;后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...