【Java 数组解析:探索数组的奇妙世界】

数组的引入

我们先通过一段简单的代码引入数组的概念。

import java.util.Scanner;
public class TestArray01{public static void main(String[] args){//功能:键盘录入十个学生的成绩,求和,求平均数://定义一个求和的变量:int sum = 0;Scanner sc = new Scanner(System.in);for(int i=1;i<=10;i++){//i:控制循环次数System.out.print("请录入第"+i+"个学生的成绩:");int score = sc.nextInt();sum += score;}System.out.println("十个学生的成绩之和为:"+sum);System.out.println("十个学生的成绩平均数为:"+sum/10);System.out.println("十个学生的成绩平均数为:"+sum/(i-1));//本题的缺点://求第6个学生的成绩:?????---》不能}
}

缺点:就是不能求每个学生的成绩具体是多少

解决:将成绩进行存储  ----》 引入 : 数组 

感受到数组的作用:数组用来存储数据的,在程序设计中,为了处理方便,数组用来将相同类型的若干数据组织起来。这个若干数据的集合我们称之为数组。

数组的定义

数组是相同类型数据的有序集合。数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成。其中,每一个数据称作一个元素,每个元素可以通过一个索引(下标)来访问它们。
数组的四个基本特点:
1.长度是确定的。数组一旦被创建,它的大小就是不可以改变的。
2.其元素的类型必须是相同类型,不允许出现混合类型。
3.数组类型可以是任何数据类型,包括基本类型和引用类型。
4.数组有索引的:索引从0开始,到 数组.length-1 结束 
5.数组变量属于引用类型,数组也是对象。
PS:数组变量属于引用类型,数组也是对象,数组中的每个元素相当于该对象的成员变量。数组本身就是对象,Java中对象是在堆中的,因此数组无论保存原始类型还是其他对象类型,数组对象本身是在堆中存储的。

下面通过一段代码来演示数组的基本使用:

public class TestArray02{public static void main(String[] args){//数组的作用:用来存储相同类型的数据//以int类型数据为案例:数组用来存储int类型数据//1.声明(定义数组)int[] arr; //定义一个int类型的数组,名字叫arr//int arr2[];//如果数组只声明,没有后续操作,那么这个数组相当于没定义//int[] arr3 = null;//空 辨别:数组赋值为null和什么都没有赋值  不一样的效果 //2.创建arr = new int[4];//给数组开辟了一个长度为4的空间//编译期声明和创建会被合为一句话: int[] arr = new int[4];//3.赋值arr[0] = 12;arr[3] = 47;arr[2] = 98;arr[1] = 56;arr[2] = 66;/*arr[4] = 93;出现异常:Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 4Array 数组Index 索引OutOf 超出Bounds 界限Exception 异常---》数组索引越界异常  *///4.使用System.out.println(arr[2]);System.out.println(arr[0]+100);//通过数组一个属性来获取  length 长度System.out.println("数组的长度是:"+arr.length);}
}

数组内存空间分析:

 基于上述的简单学习,我们回头再完善最开始引入的习题,代码如下:
 

import java.util.Scanner;
public class TestArray03{public static void main(String[] args){//功能:键盘录入十个学生的成绩,求和,求平均数://定义一个int类型的数组,长度为10 :int[] scores = new int[10];//定义一个求和的变量:int sum = 0;Scanner sc = new Scanner(System.in);for(int i=1;i<=10;i++){//i:控制循环次数System.out.print("请录入第"+i+"个学生的成绩:");int score = sc.nextInt();scores[i-1] = score;sum += score;}System.out.println("十个学生的成绩之和为:"+sum);System.out.println("十个学生的成绩平均数为:"+sum/10);//求第6个学生的成绩: //System.out.println(scores[5]);/*System.out.println(scores[0]);System.out.println(scores[1]);System.out.println(scores[2]);System.out.println(scores[3]);//....System.out.println(scores[9]);*///将数组中的每个元素进行查看--》数组的遍历://方式1:普通for循环---》正向遍历:for(int i=0;i<=9;i++){System.out.println("第"+(i+1)+"个学生的成绩为:"+scores[i]);}//方式2:增强for循环://对scores数组进行遍历,遍历出来每个元素都用int类型的num接收:int count = 0;for(int num:scores){count++;//每次都将num在控制台输出System.out.println("第"+count+"个学生的成绩为:"+num);}/*增强for循环:优点:代码简单缺点:单纯的增强for循环不能涉及跟索引相关的操作*///方式3:利用普通for循环: 逆向遍历:for(int i=9;i>=0;i--){System.out.println("第"+(i+1)+"个学生的成绩为:"+scores[i]);}}
}

用IDEA验证数组的确将数据进行存储了:

一维数组的初始化 

静态初始化

除了用new关键字来产生数组以外,还可以直接在定义数组的同时就为数组元素分配空间并赋值

eg:
int[] arr = {12,23,45};
int[] arr = new int[]{12,23,45};
注意:
1.new int[3]{12,23,45};-->错误
2.int[] arr ;
   arr = {12,23,45};
 --->错误

动态初始化

数组定义与为数组元素分配空间并赋值的操作分开进行

eg:
int[] arr ;              --->可以合并为:int[] arr = new int[3];
arr = new int[3]
arr[0] = 12;
arr[1] = 23;
arr[2] = 45;


int[] arr;
arr = new int[]{12, 23, 45};

默认初始化

数组是引用类型,它的元素相当于类的实例变量,因此数组一经分配空间,其中的每个元素也被按照实例变量同样的方式被隐式初始化

int[] arr = new int[3];   ---> 数组有默认的初始化值

数组的基本操作 

最值问题

【1】实现一个功能:给定一个数组int[] arr = {12,3,7,4,8,125,9,45}; ,求出数组中最大的数
思路图:

public class TestArray04{public static void main(String[] args){//实现一个功能:给定一个数组int[] arr = {12,3,7,4,8,125,9,45}; ,求出数组中最大的数。//1.给定一个数组int[] arr = {12,3,7,4,8,125,9,45,666,36};//2.求出数组中的最大值://先找一个数上擂台,假定认为这个数最大:int maxNum = arr[0];for(int i=0;i<arr.length;i++){if(arr[i]>maxNum){maxNum = arr[i];}}System.out.println("当前数组中最大的数为:"+maxNum);}
}

【2】将求最大值的方法提取出来:

ublic class TestArray04{public static void main(String[] args){//实现一个功能:给定一个数组int[] arr = {12,3,7,4,8,125,9,45}; ,求出数组中最大的数。//1.给定一个数组int[] arr = {12,3,7,4,8,725,9,45,666,36};//2.求出数组中的最大值://调用方法:int num = getMaxNum(arr);System.out.println("当前数组中最大的数为:"+num);}/*想提取一个方法:求数组中的最大值求哪个数组中的最大值 ---》不确定因素:哪个数组 (形参)---》返回值:最大值*/public static int getMaxNum(int[] arr){//先找一个数上擂台,假定认为这个数最大:int maxNum = arr[0];for(int i=0;i<arr.length;i++){if(arr[i]>maxNum){maxNum = arr[i];}}return maxNum;}
}

【3】画内存: 

方法的实参传递给形参的时候一定要注意:一切都是值传递
如果是基本数据类型,那么传递的就是字面值
如果是引用数据类型,那么传递的就是地址值

查询问题

【1】查询指定位置的元素

public class TestArray05{public static void main(String[] args){//查询指定位置的元素//给定一个数组:int[] arr = {12,34,56,7,3,10};//查找索引为2的位置上对应的元素是什么?System.out.println(arr[2]);}
}

上面代码体现了数组的一个优点:
在按照位置查询的时候,直接一步到位,效率非常高 

【2】查询指定元素的位置--》找出元素对应的索引  

public class TestArray06{public static void main(String[] args){//查询指定元素的位置--》找出元素对应的索引 //给定一个数组:int[] arr = {12,34,56,7,3,56};//           0  1  2  3 4  5//功能:查询元素888对应的索引:int index = -1; //这个初始值只要不是数组的索引即可for(int i=0;i<arr.length;i++){if(arr[i]==12){index = i;//只要找到了元素,那么index就变成为ibreak;//只要找到这个元素,循环就停止}}if(index!=-1){System.out.println("元素对应的索引:"+index);}else{//index==-1System.out.println("查无此数!");}}
}

【3】将查指定元素对应的索引的功能提取为方法:

public class TestArray06{public static void main(String[] args){//查询指定元素的位置--》找出元素对应的索引 //给定一个数组:int[] arr = {12,34,56,7,3,56};//           0  1  2  3 4  5//功能:查询元素888对应的索引://调用方法:int index = getIndex(arr,999);//后续对index的值进行判断:if(index!=-1){System.out.println("元素对应的索引:"+index);}else{//index==-1System.out.println("查无此数!");}}/*定义一个方法:查询数组中指定的元素对应的索引:不确定因素:哪个数组,哪个指定元素  (形参)返回值:索引*/public static int getIndex(int[] arr,int ele){int index = -1; //这个初始值只要不是数组的索引即可for(int i=0;i<arr.length;i++){if(arr[i]==ele){index = i;//只要找到了元素,那么index就变成为ibreak;//只要找到这个元素,循环就停止}}return index;}
}

添加元素

【1】实现一个功能:
添加逻辑:

public class TestArray07{public static void main(String[] args){//功能:给定一个数组,在数组下标为2的位置上添加一个元素91//1.给定一个数组:int[] arr = {12,34,56,7,3,10,55,66,77,88,999,89};//           0  1   2 3 4 5//2.输出增加元素前的数组:System.out.print("增加元素前的数组:");for(int i=0;i<arr.length;i++){if(i!=arr.length-1){System.out.print(arr[i]+",");}else{//i==arr.length-1 最后一个元素不用加,System.out.print(arr[i]);}}//3.增加元素/*arr[5] = arr[4];arr[4] = arr[3];arr[3] = arr[2];*/int index = 1;//在这个指定位置添加 元素for(int i=arr.length-1;i>=(index+1);i--){arr[i] = arr[i-1];}arr[index] = 666;//4.输出增加元素后的数组:System.out.print("\n增加元素后的数组:");for(int i=0;i<arr.length;i++){if(i!=arr.length-1){System.out.print(arr[i]+",");}else{//i==arr.length-1 最后一个元素不用加,System.out.print(arr[i]);}}}	
}

【2】将添加功能提取为一个 方法:

import java.util.Scanner;
public class TestArray07{public static void main(String[] args){//功能:给定一个数组,在数组下标为2的位置上添加一个元素91//1.给定一个数组:int[] arr = {12,34,56,7,3,10,55,66,77,88,999,89};//           0  1   2 3 4 5//2.输出增加元素前的数组:/*System.out.print("增加元素前的数组:");for(int i=0;i<arr.length;i++){if(i!=arr.length-1){System.out.print(arr[i]+",");}else{//i==arr.length-1 最后一个元素不用加,System.out.print(arr[i]);}}*///从键盘接收数据:Scanner sc = new Scanner(System.in);System.out.println("请录入你要添加元素的指定下标:");int index = sc.nextInt();System.out.println("请录入你要添加的元素:");int ele = sc.nextInt();//3.增加元素//调用方法:insertEle(arr,index,ele);//4.输出增加元素后的数组:System.out.print("\n增加元素后的数组:");for(int i=0;i<arr.length;i++){if(i!=arr.length-1){System.out.print(arr[i]+",");}else{//i==arr.length-1 最后一个元素不用加,System.out.print(arr[i]);}}}	/*提取一个添加元素的方法:在数组的指定位置上添加一个指定的元素。在哪个数组的哪个位置添加哪个元素!不确定因素:形参:哪个数组,哪个位置,哪个元素返回值:无*/public static void insertEle(int[] arr,int index,int ele){for(int i=arr.length-1;i>=(index+1);i--){arr[i] = arr[i-1];}arr[index] = ele;}
}

删除元素

【1】实现一个功能:删除指定位置上的元素

删除逻辑:

import java.util.Arrays;
public class TestArray08{public static void main(String[] args){//功能:给定一个数组,删除下标为2元素//1.给定一个数组:int[] arr = {12,34,56,7,3,10,34,45,56,7,666};//           0  1   2 3 4 5//2.输出删除前的数组:System.out.println("删除元素前的数组:"+Arrays.toString(arr));//3.删除/*arr[2] = arr[3];arr[3] = arr[4];arr[4] = arr[5];*/int index = 0;for(int i=index;i<=arr.length-2;i++){arr[i] = arr[i+1];}arr[arr.length-1] = 0;//4.输出删除后的数组:System.out.println("删除元素后的数组:"+Arrays.toString(arr));}
}

【2】实现一个功能:删除指定元素

import java.util.Arrays;
import java.util.Scanner;
public class TestArray09{public static void main(String[] args){//功能:给定一个数组,删除元素3://1.给定一个数组:int[] arr = {12,34,56,7,3,10,34,45,56,7,666};//2.输出删除前的数组:System.out.println("删除元素前的数组:"+Arrays.toString(arr));Scanner sc = new Scanner(System.in);int num = sc.nextInt();//num为删除元素值//找到要删除的元素对应的索引即可:int index = -1 ;for(int i=0;i<arr.length;i++){if(arr[i]==num){index = i;break;}}//3.删除if(index!=-1){for(int i=index;i<=arr.length-2;i++){arr[i] = arr[i+1];}arr[arr.length-1] = 0;}else{//index==-1System.out.println("根本没有你要删除的元素!");}//4.输出删除后的数组:System.out.print("删除元素后的数组:"+Arrays.toString(arr));}
}

详解main方法 

刚学完数组的基本知识,现在我们来解释下main方法中参数里面的数组是什么含义

【1】main方法:程序的入口,在同一个类中,如果有多个方法,那么虚拟机就会识别main方法,从这个方法作为程序的入口
【2】main方法格式严格要求:
public static void main(String[] args){}

public static --->修饰符 ,暂时用这个 -->在Java面向对象章节里面详细讲过修饰符,需要的可以去查看
void --->代表方法没有返回值 对应的类型void
main --->见名知意名字
String[] args  --->形参  ---》不确定因素

【3】问题:程序中是否可以有其他的方法也叫main方法?
可以,构成了方法的重载。

public class TestArray10{public static void main(String[] args){}public static void main(String str){}
}

【4】形参为String[] 那么实参到底是什么?
 

public class TestArray10{public static void main(String[] args){//从侧面验证://int[] arr1; //如果对数组只声明,没有后续操作,那么相当于 白定义了。//int[] arr2 = null; //System.out.println(arr2.length);//Exception in thread "main" java.lang.NullPointerException//int[] arr3 = new int[0];//System.out.println(arr3.length);//int[] arr4 = new int[4];//System.out.println(arr4.length);//System.out.println(args.length);//0//从这个结果证明,参数是String[],实参是  new String[0] //默认情况下,虚拟机在调用main方法的时候就是传入了一个长度为0的字符数组System.out.println(args.length);for(String str:args){System.out.println(str);}}
}

手动传入实参:
有特殊符号的时候可以加上“”

没有特殊符号用空格隔开即可:

可变参数 

1.可变参数:作用提供了一个方法,参数的个数是可变的,解决了部分方法的重载问题
int...num
double...num
boolean...num
2.可变参数在JDK1.5之后加入的新特性
3.方法的内部对可变参数的处理跟数组是一样
4.可变参数和其他数据一起作为形参的时候,可变参数一定要放在最后
5.我们自己在写代码的时候,建议不要使用可变参数

public class TestArray12{public static void main(String[] args){//method01(10);//method01();//method01(20,30,40);method01(30,40,50,60,70);//method01(new int[]{11,22,33,44});}public static void method01(int num2,int...num){System.out.println("-----1");for(int i:num){System.out.print(i+"\t");}System.out.println();System.out.println(num2);}
}

Arrays工具类的简单使用

为了方便我们对数组进行操作,系统提供一个类Arrays,我们将它当做工具类来使用。

import java.util.Arrays;
public class TestArray13{public static void main(String[] args){//给定一个数组:int[] arr = {1,3,7,2,4,8};//toString:对数组进行遍历查看的,返回的是一个字符串,这个字符串比较好看System.out.println(Arrays.toString(arr));//binarySearch:二分法查找:找出指定数组中的指定元素对应的索引://这个方法的使用前提:一定要查看的是一个有序的数组://sort:排序 -->升序Arrays.sort(arr);System.out.println(Arrays.toString(arr));System.out.println(Arrays.binarySearch(arr,4));int[] arr2 = {1,3,7,2,4,8};//copyOf:完成数组的复制:int[] newArr = Arrays.copyOf(arr2,4);System.out.println(Arrays.toString(newArr));//copyOfRange:区间复制:int[] newArr2 = Arrays.copyOfRange(arr2,1,4);//[1,4)-->1,2,3位置System.out.println(Arrays.toString(newArr2));//equals:比较两个数组的值是否一样:int[] arr3 = {1,3,7,2,4,8};int[] arr4 = {1,3,7,2,4,8};System.out.println(Arrays.equals(arr3,arr4));//trueSystem.out.println(arr3==arr4);//false ==比较左右两侧的值是否相等,比较的是左右的地址值,返回结果一定是false//fill:数组的填充:int[] arr5 = {1,3,7,2,4,8};Arrays.fill(arr5,10);System.out.println(Arrays.toString(arr5));}
}

数组的复制操作

原理:

import java.util.Arrays;
public class TestArray14{public static void main(String[] args){//给一个源数组:int[] srcArr = {11,22,33,44,55,66,77,88};//给一个目标数组:int[] destArr = new int[10];//复制:System.arraycopy(srcArr,1,destArr,3,3);//遍历查看目标数组:System.out.println(Arrays.toString(destArr));}}

二维数组的引入

直接用一张图就可以理解什么是二维数组了。

 

public class TestArray15{public static void main(String[] args){//定义一个二维数组:int[][] arr = new int[3][];//本质上定义了一个一维数组,长度为3int[] a1 = {1,2,3};arr[0] = a1;arr[1] = new int[]{4,5,6,7};arr[2] = new int[]{9,10};}
}

对应内存:

二维数组的初始化方式

静态初始化

除了用new关键字来产生数组以外,还可以直接在定义数组的同时就为数组元素分配空间并赋值

eg:
int[][] arr = {{1,2},{4,5,6},{4,5,6,7,8,9,9}};
int[][] arr =new int[][] {{1,2},{4,5,6},{4,5,6,7,8,9,9}};

动态初始化

数组定义与为数组元素分配空间并赋值的操作分开进行
eg:
int[][] arr = new int[3][]; //本质上定义了一维数组长度为3,每个“格子”中放入的是一个数组
arr[0] = {1,2};
arr[1] = {3,4,5,6};
arr[2] = {34,45,56};

eg:
int[][] arr = new int[3][2]; 

public class TestArray16{public static void main(String[] args){int[][] arr = new int[3][2];//本质上:定义一维数组,长度为3,每个数组“格子”中,有一个默认的长度为2的数组:arr[1] = new int[]{1,2,3,4};//数组遍历:for(int[] a:arr){for(int num:a){System.out.print(num+"\t");}System.out.println();}}
}

 

默认初始化

数组是引用类型,它的元素相当于类的实例变量,因此数组一经分配空间,其中的每个元素也被按照实例变量同样的方式被隐式初始化。默认初始值参考一维数组的默认初始化一样的。

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

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

相关文章

【我与CSDN的128天】相识相知相守

目录: 相识相知相守 相识 为什么选择写博客? 写博客的目的,我觉得是因为想要记录。记录学习的过程,整理学过的知识,方便今后的复习。 更重要的是热爱分享,分享给别人知识也是一种快乐。 在某一瞬间教会某一个你不认识的人,难道不是一个很酷的事情吗? 为什么选择CSDN? 作…

企业签名分发对移动应用开发者有什么影响

企业签名分发是移动应用开发者在应用程序发布前测试、内部分发和特定的受众群体分发等方面比较常用的一种工具。那对于应用商城分发有啥区别&#xff0c;下面简单的探讨一下。 独立分发能力 通过企业签名分发开发者可以自己决定应用程序的发布时间和方式&#xff0c;不用受应用…

[2024区块链开发入门指引] - 比特币运行原理

一份为小白用户准备的免费区块链基础教程 工欲善其事,必先利其器 Web3开发中&#xff0c;各种工具、教程、社区、语言框架.。。。 种类繁多&#xff0c;是否有一个包罗万象的工具专注与Web3开发和相关资讯能毕其功于一役&#xff1f; 参见另一篇博文&#x1f449; 2024最全面…

Android14之禁掉Selinux的两种方式(一百七十四)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

uniapp的分包使用记录

UniApp的分包是一种将应用代码划分为多个包的技术。分包的核心思想是将不同部分的代码划分为不同的包&#xff0c;按需加载&#xff0c;从而提高应用性能。使用UniApp的条件编译功能&#xff0c;开发人员可以根据需要将代码划分为多个包。每个包都包含一组页面和组件&#xff0…

大数据Doris(四十五):物化视图选择最优

文章目录 物化视图选择最优 物化视图选择最优 下面详细解释一下第一步最优物化视图是被如何选择出来的。 这里分为两个步骤: 对候选集合进行一个过滤。只要是查询的结果能从物化视图数据计算(取部分行,部分列,或部分行列的聚合)出都可以留在候选集中,过滤完成后候选集合…

RocketMQ源码解析-主从同步原理(HA)

1、关键组件 主从同步的实现逻辑主要在HAService中&#xff0c;在它的构造函数中实例化了几个对象同时在start()方法内执行启动&#xff1a; public class HAService {public HAService(final DefaultMessageStore defaultMessageStore) throws IOException {this.defaultMes…

李宏毅机器学习第二十三周周报 Flow-based model

文章目录 week 23 Flow-based model摘要Abstract一、李宏毅机器学习1.引言2.数学背景2.1Jacobian2.2Determinant2.3Change of Variable Theorem 3.Flow-based Model4.GLOW 二、文献阅读1. 题目2. abstract3. 网络架构3.1 change of variable formula3.2 Coupling layers3.3Prop…

阿里云域名外部入库流程

注册商是阿里云&#xff0c;且在阿里云管理的&#xff0c;请使用此教程外部入库。 如您的域名注册商是阿里云但在聚名管理&#xff0c;请参考教程&#xff1a;https://www.west.cn/faq/list.asp?unid2539 在外部入库操作之前&#xff0c;请先登录阿里云获取账号ID。详细的账…

软件测试方法分类-按照是否手工执行划分

接上一篇,下来我们再细讲,第二个维度的分类, 软件测试方法分类-按照是否手工执行划分 按是否手工执行划分 1,手工测试(manualTesting) 手工测试是由人一个一个的输入用例,然后观察结果,和机器测试相对应,属于比较原始但是必须的一种。 2,自动化测试(automationTestin…

【刷题日志】深度理解除(/)与取模(%)附水仙花数以及变种水仙花数题解

文章目录 &#x1f680;前言&#x1f680;除与取模&#x1f680;水仙花数&#x1f680;变种水仙花数 &#x1f680;前言 本专栏文章都直奔刷题主题&#xff0c;阿辉都不会在废话了&#xff0c;加油&#xff0c;少年&#xff01;&#xff01;&#xff01; &#x1f680;除与取…

STM32CubeMX教程11 RTC 实时时钟 - 入侵检测和时间戳

目录 1、准备材料 2、实验目标 3、实验流程 3.0、前提知识 3.1、CubeMX相关配置 3.1.1、时钟树配置 3.1.2、外设参数配置 3.1.3、外设中断配置 3.2、生成代码 3.2.1、外设初始化调用流程 3.2.2、外设中断调用流程 3.2.3、添加其他必要代码 4、常用函数 5、烧录验…

探索 CodeWave低代码技术的魅力与应用

目录 前言1 低代码平台2 CodeWave简介3 CodeWave 的独特之处3.1 高保真还原交互视觉需求3.2 擅长复杂应用开发3.3 支持应用导出&独立部署3.4 金融级安全要求3.5 可集成性高3.6 可拓展性强 4 平台架构和核心功能4.1 数据模型设计4.2 页面设计4.3 逻辑设计4.4 流程设计4.5 接…

新能源汽车冷却系统的水道管口类型有哪些?格雷希尔针对这些管口密封的快速接头有哪些?

对于新能源汽车&#xff0c;不仅电池&#xff0c;还有电机、电控、充电单元部件&#xff0c;都需要处于适宜的工作温度&#xff0c;才能维持整车的正常运行。而这些部件在运行过程中会产生大量的热量&#xff0c;如果不及时散热会对汽车的性能、寿命产生影响&#xff0c;甚至可…

Scrapy爬虫中合理使用time.sleep和Request

概述 在Scrapy爬虫中&#xff0c;我们需要深入分析time.sleep和Request对象对并发请求的影响。time.sleep函数用于在发起请求之前等待一段时间&#xff0c;而Request对象用于发送HTTP请求。我们必须仔细考虑这些操作对其他并发请求的潜在影响&#xff0c;以及在异步情况下可能…

TTS | NaturalSpeech语音合成论文详解及项目实现【正在更新中】

----------------------------------&#x1f50a; 语音合成 相关系列直达 &#x1f50a; ------------------------------------- ✨NaturalSpeech&#xff1a;正在更新中~ ✨NaturalSpeech2&#xff1a;TTS | NaturalSpeech2语音合成论文详解及项目实现 本文主要是 讲解了Nat…

基于孔雀优化算法的航线规划

MATLAB2020a下正常运行 上传明细-CSDN创作中心

Excel中部分sheet页隐藏并设置访问密码

1、新建sheet1 2、新建sheet2 3、隐藏sheet2 4、保护工作簿、输密码 5、密码二次确认 6、隐藏的sheet2已经查看不了 7、想要查看时&#xff0c;按图示输入原密码即可 8、查看sheet2内容

【软件工程】航行敏捷之路:深度解析Scrum框架的精髓

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a; 软件工程 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 Scrum&#xff08;敏捷开发框架之一&#xff09; 详细介绍和解释&#xff1a; 优缺点&#xff1a; 优点&#xff1a; 缺点&…

【MySQL】数据库之高级SQL查询语句补充

目录 一、补充正则表达式的查询regexp 二、补充case的用法 三、补充空值和null值的区别 一、补充正则表达式的查询regexp 要知道 在MySQL中使用正则表达式&#xff0c;一定要在前面加上regexp 正则表达式 ^ 匹配文本的开始字符 ‘^bd’ 匹配以 bd 开头的字符串 …