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

【JavaSE】数组的定义与使用详解

目录

1.数组的基本概念 

1.1数组的好处

1.2什么是数组

1.3数组的定义及初始化

1.3.1数组的创建

1.3.2数组的初始化

1.4数组的使用

1.4.1访问数组中的元素

1.4.2遍历数组

2.数组的类型

2.1认识JVM的内存分布

2.2基本类型变量与引用类型变量

2.3认识null

3.数组的应用场景

3.1保存数据

3.2作为函数的参数

3.3作为函数的返回值

4.数组练习

4.1数组转字符串

4.2求数组的元素平均值(保留整数)

4.3查找数组中的指定元素(顺序查找)

4.4查找数组中的指定元素(二分查找)

4.5数组排序(冒泡排序)

 4.6数组逆序

5.二维数组

5.1二维数组的定义

5.2二维数组的遍历


1.数组的基本概念 

1.1数组的好处

当我们打印出3个同学的数学成绩的时候。我们可以这样做:

public class Test {public static void main(String[] args) {int score1 = 99;int score2 = 80;int score3 = 60;System.out.println(score1);System.out.println(score2);System.out.println(score3);}
}

输出效果:

我们发现少量的数据进行打印的时候是非常容易,那么如果有100个人的成绩或者200个同学的成绩需要打印呢?这时候一个一个去打印就非常的麻烦了,因此我们就有了一个概念就是本期所要学的数组。它可以将这些相同类型的数据存放在一个集合里面,这就是它的好处。


1.2什么是数组

数组是相同类型元素的一个集合。在内存是连续存放的,类似于现实生活中的车库。

 以上图片就是两个连续的存储方式,左侧就是我们的数组大概的模样。数组的几个注意事项:

  1. 数组中存放每个元素类型都一致
  2. 数组的空间是连续存放的
  3. 数组的下标从0开始依次往后递增

1.3数组的定义及初始化

1.3.1数组的创建

在上面我们知道数组的用处,以及在内存大概的布局模样后,数组是如何创建的呢?

type[] 数组名 = new type[N];

type:表示数组中存放的各个元素的类型

type[]:表示数组的类型

N:表示数组的长度 

 创建三个数组:

int[] arry1 = new int[10];
double[] arry2 = new double[5];
String[] arry3 = new String[3];

int[] arry1 = new int[10];//定义一个名为arry1的数组,里面可以存放10个整型元素。

double[] arry2 = new double[5];//定义一个名为arry2的数组,里面可以存放5个双精度浮点型元素。

String[] arry3 = new String[3];//定义一个名为arry3的数组,里面可以存放3个字符串。 


1.3.2数组的初始化

数组的初始化分为动态初始化以及静态初始化

(1)动态初始化,我们直接规定数组元素的个数,如:

int[] arry= new int[10];

(2)静态初始化,在创建数组的时候不规定数组元素的个数,并直接将数组的内容进行设定,如:

int[] arry1 ={1,2,3,4,5};
double[] arry2 ={3.1,2.4,6.3};
String[] arry3 ={"abc","123","hello"};

注意:

  1. 静态初始化的时,虽然没有指定数组元素的个数。但直接将数组设定为固定的值后,编译器会自动计算出该数组元素的个数。因此大家不必担心。
  2.  静态初始化时,{}里面的每个元素应保持类型一致,并且使用,号隔开。

当我们创建数组后并未对其进行初始化,数组中元素会自动设置默认值为0。如:

public class Test {public static void main(String[] args) {int[] arry = new int[10];System.out.println(Arrays.toString(arry));}
}

输出:

以上代码,我们发现创建一个整型数组后没有对其进行初始化,它的每个元素默认都为0。在上述代码中,我引用了一个方法Arrays.toString(数组名)意为:以字符串的形式输出该数组。那么数组中存储元素的类型为基本类型,其各个类型对应的默认值,如下表所示:

类型默认值
byte0
short0
int0
long0
float0.0f
double0.0
char/u0000
booleanfalse

大家可以下来自己测试一下,在此我就不一一测试了。注意,如果数组中存储元素类型为引用类型,其默认值为null,下面我会讲到。


1.4数组的使用

1.4.1访问数组中的元素

在1.2中我们知道了,数组是从下标为0的下标依次往后执行的。并且数组可以通过下标访问到想访问到的数据。比如我想访问到一个数组的第5个数,我们可以通过下标为4的数组找到该元素。

请看以下代码:

public class Test {public static void main(String[] args) {int[] arry ={1,2,3,4,5};System.out.println(arry[0]);System.out.println(arry[4]);arry[0] = 6;System.out.println(arry[0]);}
}

输出:

观察以上代码,我们不难发现。当我们想访问那个元素的时候,直接数组名[下标]就行。唯一要注意的是第一个元素下标为0因此,当你想访问第5个元素时下标应当为4。当然我们也可以修改数组里面的元素,例如上述代码中,我修改了第一个元素使得1变为6。

注意,数组是一段连续的存储空间,我们需要依次通过下标来访问各个元素。当我们知道一个数组总共有6个元素的时候,我们不能去访问第6个元素以后的空间。如:

public class Test {public static void main(String[] args) {int[] arry ={1,2,3,4,5,5};System.out.println(arry[6]);}
}

显示:

当我们访问超出该数组的范围后的元素,会出现java.lang.ArrayIndexOutOfBoundsException 异常。我们称为数据越界访问,因此我们把数组下标的范围介于[0,N)。


1.4.2遍历数组

遍历,我们认为是依次从左往右打印出数组的各个元素,类似于现实生活中的从左往右的点到。例:

public class Test {public static void main(String[] args) {int[] arry ={1,2,3,4};System.out.println(arry[0]);System.out.println(arry[1]);System.out.println(arry[2]);System.out.println(arry[3]);}
}

输出:

以上代码就是遍历一个数组的过程,但我们发现遍历这个数组的代码太大了。如果一个数组的元素很少,我们可以用此方法进行遍历。但如果一个数组了有成千上万的元素时候,一行一行的去打印的话会很浪费大量时间。因此我们可以用到for循环语句来实现该遍历。

public class Test {public static void main(String[] args) {int[] arry ={1,2,3,4};for (int i = 0; i < 4; i++) {System.out.println(arry[i]);}}
}

 输出:

通过for语句,进行打印我们会便利许多,不必一行一行进行遍历。在上述代码中,我们发现创建数组时候我们知道了元素的个数,可以进行设置for语句的终止条件,但如果给我们一个别人创建的数组我们如何取得其长度呢?Java中提供了一个数组名.length的方法可取得数组元素的个数。如:

public class Test {public static void main(String[] args) {int[] arry ={1,2,3,4};for (int i = 0; i < arry.length; i++) {System.out.println(arry[i]);}}
}

  输出:

还有一种遍历方法,那就是for-each

public class Test {public static void main(String[] args) {int[] arry ={1,2,3,4};for (int x:arry) {System.out.println(x);}}
}

  输出:

for-each是for循环的另一种表示方式,它能很清晰的遍历出数组的各个元素,可以避免循环条件和更新语句写错。


2.数组的类型

数组是一种引用类型,数组也是一数据结构,只不过数组的结构比较易懂,存储的都是相同元素。为什么数组是一种引用类型,下面就让我来一一讲解。


2.1认识JVM的内存分布

内存是一段连续的存储空间,主要是用来存放正在运行的程序的数据。比如:

  1. 程序运行时代码要加载到内存
  2. 程序运行时产生的中间变量要存放在内存
  3. 程序中的常量也在内存中

如果内存没有把这些程序运行的结果有条理的存放在一块块类似于单元格里边,那内存将存不了一点东西,甚至会造成我们数据的丢失。就像我们生活中,我刚回到家把钥匙随手一扔。由于桌面上很乱,导致我下一次出门时一时半找不到钥匙,甚至会把钥匙当成垃圾给扔掉。内存亦是如此,如果我们不按条理的把一些数据任意存放就会造成无法挽回的后果。

 因此JVM按照使用内存的功能依次划分了不同的存储区域,如下图所示:

  • 程序计数器 (PC Register): 只是一个很小的空间, 保存下一条执行的指令的地址。
  • 虚拟机栈(JVM Stack): 与方法调用相关的一些信息,每个方法在执行时,都会先创建一个栈帧,栈帧中包含有:局部变量表、操作数栈、动态链接、返回地址以及其他的一些信息,保存的都是与方法执行时相关的一些信息。比如:局部变量。当方法运行结束后,栈帧就被销毁了,即栈帧中保存的数据也被销毁了
  • 本地方法栈(Native Method Stack): 本地方法栈与虚拟机栈的作用类似. 只不过保存的内容是Native方法的局部变量. 在有些版本的 JVM 实现中(例如HotSpot), 本地方法栈和虚拟机栈是一起的
  • (Heap): JVM所管理的最大内存区域. 使用 new 创建的对象都是在堆上保存 (例如前面的 new int[]{1, 2,3} ),堆是随着程序开始运行时而创建,随着程序的退出而销毁,堆中的数据只要还有在使用,就不会被销毁。
  • 方法区(Method Area): 用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据. 方法编译出的的字节码就是保存在这个区域。

在本篇博文中,我们现只简单关心虚拟机栈这两块空间,后序博文中我会把JVM更为详细的介绍给大家。


2.2基本类型变量与引用类型变量

基本数据类型创建的变量,我们称为基本变量,该变量在内存中存放的是相应的值。基本数据类型有八种其中有六种数字类型(四个整数型,两个浮点型)和一个字符型与布尔型。四个整数型又分为:字节型、短整型、整型、长整型,两个浮点型又分为:单精度浮点型和双精度浮点型。

引用数据类型创建的变量,一般称为对象的引用,其内存中存放的是对象所在空间的地址。

    public static void main(String[] args) {int a = 10;int b = 20;int[]arry ={1,2,3,4};}

以上代码中,a、b、arry都是变量,都在main方法中对应相应的栈帧。其中a和b为基本类型的变量因此在内存中保存的就是初始化相应的值。而arry是数组类型也就是引用变量,其在内存中保存的为数组在堆空间中的首地址。结合下图理解:

 通过上图,我们可以理解到基本的类型,在内存中存储的就是初始化的值。而像数组这种引用类型存放的则是一个地址。这个地址从左往右里面放到就是数组里面的各个元素。


2.3认识null

null在Java中表示"空引用",也就是一个不指向对象的引用。比如我创建一个数组并初始化null:

public class Test {public static void main(String[] args) {int[]arry = null;System.out.println(arry[0]);}
}

输出:

Java中的null类似于C语言中的NULL(空指针),都表示指向一个未知的未知。因此不能对这个内存进行任何操作,一旦操作就会抛出NullPointerException(空指针异常)。一般把数组初始化null就是暂时不用这个数组或是特意把这个数组置为空。


3.数组的应用场景

数组的应用场景一般有三种:保存数据作为函数参数作为函数返回值。


3.1保存数据

保存数据就比较容易理解,比如我有一组相同的数据。那么这时候可以用数组进行保存:

public class Test {public static void main(String[] args) {int[]arry ={1,2,3,4,5};for (int i = 0; i < arry.length; i++) {System.out.println(arry[i]);}}
}

输出:


3.2作为函数的参数

(1参数为基本数据类型)

public class Test {public static void fun(int x) {x = 0;System.out.println("x="+x);}public static void main(String[] args) {int num = 10;fun(num);System.out.println("num="+num);}
}

输出:

以上代码,我们可以发现fun方法里面对x进行修改。最终num的值并未发生改变。它在内存中应该是这个样子的:

(2参数为引用数据类型)

public class Test {public static void fun(int[] a) {a[0] = 10;System.out.println("a[0]="+a[0]);}public static void main(String[] args) {int[] arry={1,2,3,4};fun(arry);System.out.println("arry[0]="+arry[0]);}
}

输出:

上述代码,我们发现。我在fun方法中对a[0]进行修改,后。main方法里面的arry[0]也发生了改变,原因在于数组是引用类型,按照引用类型来进行传递,是可以进行修改的。结合下图理解:

通过上图,我们可以理解到。当fun方法中接收了arry的数组名意味着a数组也指向了堆上面整个数组的地址。因此通过a数组可以修改arry数组里面的内容。


3.3作为函数的返回值

public class Test {public static int[] fun() {int[] arr ={1,2,3,4};return arr;}public static void main(String[] args) {int[] arry=fun();System.out.println(arry[0]);}
}

输出:

上述代码,展示了数组名作为返回值的演示。arry数组通过返回来的arr数组名指向了arr数组。因此可以通过arry数组得到arr数组的元素。在内存中的布局大概是这个样子:

总结:

  1. 数组是一段连续的内存空间,因此支持随机访问,即通过下标访问快速访问数组中任意位置的元素。
  2. 数组下标从0开始,介于[0, N)之间不包含N,N为元素个数,不能越界,否则会报出下标越界异常。
  3. 数组是引用类型,数组名在方法栈中存放的是引用对象的地址。

4.数组练习

4.1数组转字符串

(方法1)

public class Test {public static void main(String[] args) {int[] arry={1,2,3,4};System.out.println(Arrays.toString(arry));}
}

输出:

 

上述代码中,我用到了一个Arrays.toString(数组名)的方法。这个方法的功能就是把,一个数组里面所有的元素以字符串的形式打印出来。

(方法2)

public class Test {public static void main(String[] args) {int[] arry={1,2,3,4};System.out.print("[");for (int i = 0; i <arry.length; i++) {System.out.print(arry[i]);if(i<arry.length-1) {System.out.print(",");}}System.out.print("]");}
}

输出:

上述代码,则是用for循环遍历来实现。实现的就是Arrays.toString的“盗版”。 


4.2求数组的元素平均值(保留整数)

public class Test {public static void main(String[] args) {int[]arr={9,9,1};int sum = 0;for (int i = 0; i < arr.length; i++) {sum+=arr[i];}int avg = sum/arr.length;System.out.println(avg);
}

 输出:

求数组元素的平均值,我们只需要将数组的各个元素加起来然后除以元素总个数就好了。


4.3查找数组中的指定元素(顺序查找)

public class Test {public static void main(String[] args) {int[] arry={1,2,3,4,5};Scanner sc = new Scanner(System.in);System.out.print("输入一个整数:");int num = sc.nextInt();for (int i = 0; i < arry.length; i++) {if (num == arry[i]) {System.out.println("有此数,下标为:"+i);break;}if (i == arry.length-1) {System.out.println("没有此数");}}}
}

输出:

顺序查找,就是把数组遍历一遍。直到找到出想要的数字然后使用break退出循环即可。 


4.4查找数组中的指定元素(二分查找)

public class Test {public static void main(String[] args) {int[] arry={1,2,3,4,5};Scanner sc = new Scanner(System.in);int key = sc.nextInt();int left=0;int right=arry.length-1;int mid = 0;int flag=-1;while(left<=right) {mid=(left+right)/2;if (key < arry[mid]) {right = mid-1;}else if(key > arry[mid]) {left = mid+1;}else {System.out.println("找到了");flag=1;break;}}if (flag==-1) {System.out.println("没有这个数");}
}
}

结果:

二分查找又叫折半查找,算法:从最中间开始查找。按照第一次查找来取范围,如果这个数小于中间数,就在第一个数与中间数之间查找,并再次从最中间开始查找。如果这个数大于中间数,就在中间数与最后一个数之间查找,并再次从最中间开始查找。如果中间数等于这个数第一次就直接能找到,否则按照前两步骤查找直到找到该数。就拿上述程序举例:

多学两招:

public class Test {public static void main(String[] args) {int[] arr = {1,2,3,4,5,6,7};int ret = Arrays.binarySearch(arr,6);System.out.println(ret);}
}

 输出:

我们知道二分查找,必须保证数组是有序的。如果一个数组乱序的是无法完成排序的,因此我们可以使用方法来实现一个乱序的数组变为有序的。

public class Test {public static void main(String[] args) {int[] arr = {9,4,2,1,0,7,8,3,6,5};Arrays.sort(arr);String ret = Arrays.toString(arr);System.out.println(ret);}
}

 输出:

我们可以看到原本乱序的数组在经过Arrays.sort(数组名)这个方法排序变得顺序了,我们再用到一个Arrays.toString(数组名)的方法来实现以字符串的形式输出数组各个元素。


4.5数组排序(冒泡排序)

public class Test {public static int[] Fun(int[] arr) {for (int i = 0; i < arr.length-1; 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;}}}return arr;}public static void main(String[] args) {int[] arr = {9,4,2,1,0,7,8,3,6,5};Fun(arr);for (int i = 0; i < arr.length; i++) {System.out.print(arr[i]+" ");}}
}

输出:

冒泡排序是将一个乱序的数组,排序为一个有序的数组。它的算法为:遍历这个数组数组元素的个-1次。每一次遍历使得这个数组的最大的数或最小的数到数组的最后一位,当然下一次遍历的时候不会再将上一次遍历得到的最大数进行比较了,因为每次遍历时候已经把本次遍历的最大数或最小数移到最后一位。比如拿上述程序数组来举例:


 4.6数组逆序

public class Test {public static void main(String[] args) {int[] arr= {1,2,3,4,5,6};int left = 0;int right = arr.length-1;int tmp = 0;while(left<right) {tmp = arr[left];arr[left] = arr[right];arr[right] = tmp;left++;right--;}for (int i = 0; i < arr.length; i++) {System.out.println(arr[i]);}}
}

输出:

数组的逆序就比较简单,我们只需要将第一与最后一个进行交换、第二个与倒数第二个进行交换依次类推,直到完成交换。我们可以用到两个下标和一个中间变量来实现这些操作。


5.二维数组

5.1二维数组的定义

二维数组的定义,分为初始化定义与不初始化定义。

int[][] arry1 = {{1,2,3},{4,5,6}};//初始化定义
int[][] arry2 = new int[2][3];//不初始化定义


5.2二维数组的遍历

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

输出:

当我们知道二维数组有几行几列的时候可以这样去遍历。当我们不知道的时候,可以使用数组名.length来实现行数,列数我们只需要将数组名[行数].length就可以得到。

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

输出:

 

由于二维数组比较简单,因此在本篇博文就讲到这里。一般情况下,我们使用一维数组比较多。二维数组用得较少。


下期博客预告:类和对象

本期博客到这里就结束了,感谢你的观看。 

相关文章:

【JavaSE】数组的定义与使用详解

目录 1.数组的基本概念 1.1数组的好处 1.2什么是数组 1.3数组的定义及初始化 1.3.1数组的创建 1.3.2数组的初始化 1.4数组的使用 1.4.1访问数组中的元素 1.4.2遍历数组 2.数组的类型 2.1认识JVM的内存分布 2.2基本类型变量与引用类型变量 2.3认识null 3.数组的应…...

Kubernetes14:Helm为了部署像微服务这种的大型项目

Kubernetes14&#xff1a;Helm介绍&#xff08;为了部署像微服务这种的大型项目&#xff09; 1、Helm的引入 (1)之前方式部署应用基本过程 编写yaml文件 1、deployment kubectl create deployment nginx --imagenginx --dryrun -o yaml > nginx.yaml2、Service kubect…...

2.3操作系统-存储管理:页式存储、逻辑地址、物理地址、物理地址逻辑地址之间的地址关系、页面大小与页内地址长度的关系、缺页中断、内存淘汰规则

2.3操作系统-存储管理&#xff1a;页式存储、逻辑地址、物理地址、物理地址逻辑地址之间的地址关系、页面大小与页内地址长度的关系、缺页中断、内存淘汰规则页式存储逻辑地址、物理地址如何判断物理地址和逻辑地址它们之间的地址关系&#xff1f;页面大小与页内地址长度的关系…...

设计模式3——结构型模式

结构型模式描述如何将类或对象按某种布局组成更大的结构&#xff0c;它分为类结构型和对象结构型模式&#xff0c;前者采用继承机制来组织接口和类&#xff0c;后者采用组合或聚合来组合对象。 由于组合关系或聚合关系比继承关系耦合度低&#xff0c;满足“合成复用原则”&…...

css——图片缩放,拉伸,变形的解决办法

你的图片即将变得超级丝滑图片为什么会拉伸变形&#xff1f;怎么解决&#xff1f;css的object-fit属性object-fit属性有什么用介绍一下object-position举个小栗子图片为什么会拉伸变形&#xff1f; 前端布局时&#xff0c;图片会出现拉伸、缩放和变形的原因可能有多种: 1.例如图…...

【工具使用】STM32CubeMX-基础使用篇

一、概述 无论是新手还是大佬&#xff0c;基于STM32单片机的开发&#xff0c;使用STM32CubeMX都是可以极大提升开发效率的&#xff0c;并且其界面化的开发&#xff0c;也大大降低了新手对STM32单片机的开发门槛。     本文主要面向初次接触STM32CubeMX的同学&#xff0c;大…...

面试题解-理解cookie、session和token

项目vuespringboot 1、token 用户填写密码账号发送至后端&#xff0c;由后端生成token&#xff0c;返回给前端&#xff0c;前端把它存放起来&#xff0c;如放在cookie或者localStorage里面 前端向服务器发起请求时在请求头携带token&#xff0c;判断用户身份给与反应。 //后…...

Buuctf [GUET-CTF2019]number_game 题解

目录 一.主函数逻辑 二.level_stor()函数 三.mid_stor函数 四.operate函数 五.judge2函数 六.求解flag 一.主函数逻辑 ①先输入一个字符串,然后judge1()函数遍历它,判断字符是否在[0,4]区间范围内 ②将输入的字符串用层次遍历的方式存储为一个二叉树root ③再将二叉树r…...

OsgEarth配置.earth文件支持wms服务

<!-- 参考 http://vmap0.tiles.osgeo.org/wms/vmap0?LAYERSbasic&SERVICEWMS&VERSION1.1.1&REQUESTGetMap&STYLES&FORMATimage%2Fjpeg&SRSEPSG%3A4326&BBOX-90,45,-45,90&WIDTH256&HEIGHT256 --> <!-- 可用 2023.03.09--> …...

【数据结构】详解空间复杂度

Yan英杰的博客 悟已往之不谏 知来者之可追 目录 空间复杂度 ​案例1:计算BubbleSort的空间复杂度&#xff1f; 案例2:计算斐波那契额数列的前N项的空间复杂度 案例3:计算阶乘递归Fac的空间复杂度&#xff1f; 案例4:F1和F2两函数是否使用的同一块空间 案例5:计算该…...

腾讯云GPU游戏服务器/云主机租用配置价格表

用于游戏业务的服务器和普通云服务器和主机空间是不同的&#xff0c;游戏服务器对于硬件的配置、网络带宽有更大的要求&#xff0c;一般游戏服务器根据不同的配置和适用场景会有十几元一小时到几十元一小时&#xff0c;而且可以根据不同的按量计费。而普通的云服务器可能需要几…...

配置临时SSL子域名泛化证书

配置临时SSL子域名泛化证书 三个月有效期第一步&#xff1a;访问SSL证书地址第二步&#xff1a;在华为云上/其他服务器上搜索DNS云解析服务类似的功能第三步&#xff1a;将SSL申请的信息添加到服务器的记录集中第四步&#xff1a;添加完信息进行保存获取key / crt第五步&#x…...

【Linux:环境变量的理解】

目录 1 Z(zombie)-僵尸进程 2 孤儿进程 3 环境变量 3.1 基本概念 3.2 测试HOME 3.3 和环境变量相关的命令 3.4 环境变量的组织方式 3.5 环境变量通常是具有全局属性的 在讲环境变量之前&#xff0c;我们先把上次遗留知识点给总结了&#xff08;僵尸进程和孤儿进程&…...

python数据类型与数据结构

目录 一、数据类型 1.1变量与常量 1.1.1变量 1.1.2常量 1.2字符串类型 1.3整数与浮点数 1.4List列表 1.5 元组tuple 1.6字典dict 二、字符串格式化 三、数据输入和类型转换 四、简单列表习题练习 一、数据类型 变量类型&#xff1a; 整数int&#xff08;4字节&#x…...

大数据自学学习技巧?

经常有人说&#xff1a;先别管大数据是什么&#xff0c;现在理解不了没关系&#xff0c;先开始学&#xff0c;等学着学着就明白了&#xff0c;这种学习路线基本是混合的&#xff0c;很难分清楚自己学了这段怎么用在以后项目中&#xff0c;所以会越学越迷茫&#xff0c;但是等你…...

Qt音视频开发22-音频播放QAudioOutput

一、前言 以前一直以为只有Qt5以后才有QAudioOutput播放音频&#xff0c;其实从Qt4.6开始就有&#xff0c;在Qt6中变成了QAudioSink&#xff0c;功能一样。用QAudioOutput播放音频pcm数据极其方便&#xff0c;只需要指定音频播放设备&#xff08;可能电脑上有多个音频输出设备…...

JavaEE简单示例——Spring的入门程序

简单介绍&#xff1a; 在之前我们简单的介绍了有关于Spring的基础知识&#xff0c;那么现在我们就来一步步的把理论融入到实践中&#xff0c;开始使用这个框架&#xff0c;使用过程也是非常的简单&#xff0c;大致可以分为几个基础的步骤&#xff1a; 1.首先引入Spring的Mave…...

【嵌入式Bluetooth应用开发笔记】第一篇:DBUS概述与蓝牙开发小试牛刀

DBUS概述 DBus&#xff08;D-Bus&#xff09;是一个在不同程序之间传递消息的系统总线。DBus为不同的程序之间提供了一种通信机制&#xff0c;这种通信制可以在不需要知道对方程序的情况下进行通信。 DBus可以使用多种编程语言来开发&#xff0c;包括C、C、Python、Java等。在…...

如何在电脑更换新硬盘后迁移window11系统?2种迁移方法分享!

随着时间的流逝&#xff0c;数据量也在逐渐增多&#xff0c;就会导致您的硬盘空间也变得越来越小&#xff0c;因此系统运行速度可能会受到一些影响而越来越慢。为了摆脱这种情况&#xff0c;您可以选择升级到更大的硬盘来使计算机获取更大的磁盘空间&#xff0c;或者迁移系统到…...

6、Elasticsearch优化

一、Elasticsearch集群配置 1、硬件选择 Elasticsearch的基础是 Lucene &#xff0c;所有的索引和文档数据是存储在本地的磁盘中&#xff0c; 具体的路径可在 ES 的配置文件 ../config/elasticsearch.yml 中配置&#xff0c;如下&#xff1a;磁盘在现代服务器上通常都是瓶颈。…...

给力|这是一个专业的开源快速开发框架!

在低代码开发市场&#xff0c;专业的开源快速开发框架可以助力企业提升办公协作效率&#xff0c;实现提质增效的办公自动化的发展目标。 流辰信息低代码技术开发平台服务商&#xff0c;拥有丰富的技术经验和案例合作经验&#xff0c;针对不同的客户需求&#xff0c;提供个性化、…...

CIMCAI smart shipping company product container damage identify

世界港航人工智能领军者企业CIMCAI&#xff0c;领先智能航运船公司集装箱管理产品ceaspectusS™全球规模化应用落地智能化航运&#xff0c;全球前三船公司认可验箱标准应用。全球港航人工智能领军者企业CIMCAI&#xff0c;是全球第一家完成两百万次人工智能验箱&#xff0c;上亿…...

ego微商小程序项目-接口测试

文章目录 1.接口理论回顾1.1 接口测试相关概念1.2 接口测试流程2.接口测试文档2.1 接口测试文档基础2.2 ego微商小程序的接口文档解析3.设计接口测试用例3.1 接口测试用例基础3.2 ego微商小程序接口测试用例4. 执行测试用例4.1 ego小程序测试用例执行4.1.1 首页-轮播图4.1.2 用…...

excel文件已经损坏怎么办

1. excel文件突然损坏怎么办Excel修复不成功还可以尝试其他修复方式。1、Excel提示文件已损坏可能是受保护视图的问题。如果打开文件碰到此提示&#xff0c;可以先点确定。在按以下步骤操作&#xff1a;1&#xff09;在空白程序界面&#xff0c;点击功能栏的【文件】&#xff0…...

Java【数据结构入门OJ题33道】——力扣刷题记录1

文章目录第一天存在重复元素最大子数组和第二天两数之和合并两个有序数组第三天两个数组的交集买卖股票最佳时机第四天重塑矩阵杨辉三角第五天有效的数独矩阵置零第六天字符串中第一个唯一字符救赎金第七天判断链表是否有环合并两个有序链表移除链表元素第八天反转链表删除重复…...

Spring事务介绍

文章目录一、编程式事务二、声明式事务&#xff08;常用&#xff09;三、事务实战详解3.1&#xff09;事务的回滚机制3.2&#xff09;事务的传播3.3&#xff09;事务超时时间3.4&#xff09;事务隔离级别3.5&#xff09;事务回滚条件Spring中对事务有两种支持方式&#xff0c;分…...

Intellij Idea如何使用VM

打开Run/Debug Configuration 然后在More option 里选择 add VM options 根据要实现的目的选择main class 比如说要建造class diagram 那就选择app.ClassDiagramGenerator 然后在下面那行输入 D:\software-engineering\2023\commons-compress\target\classes true true org.apa…...

基础04-什么时候不能使用箭头函数

箭头函数的缺点 题目 什么时候不能使用箭头函数&#xff1f; 箭头函数的缺点 没有 arguments const fn1 () > {console.log(this, arguments) // 报错&#xff0c;arguments is not defined } fn1(100, 200)无法通过 call apply bind 等改变 this const fn1 () >…...

算法小抄5-原地哈希

书接上回,学会了数组中重复数字的解法三,相信接下来的题也难不倒你 找到数组中消失的数字 题目链接 题意 对于一个大小为n的数组,数组中所有的数都在[1,n]内,其中有些数字重复了,由于有些数字重复了,另一些数字就一定会确实,这次需要找到所有缺少的数字并且返回结果 有没有发…...

java零基础入门(1)

java零基础入门一、JRE和JDK1.1 JRE1.2 JDK1.3 IDK&#xff0c;JRE&#xff0c;JVM三者的包含关系二、CMD2.1 打开CMD2.2 常用CMD命令2.2.1 盘符名称 冒号2.2.2 dir2.2.3 cd 目录2.2.4 cd ..2.2.5 cls2.2.6 exit2.2.7 cd \2.2.8 cd \目录\目录\目录\目录2.3 利用快捷cmd打开 Q…...

java socket实例

/*** 启动项目后就创建Server Socket服务*/PostConstructpublic void runServerSocket() {try {ExecutorService executorService Executors.newFixedThreadPool(10);// 创建线程池ServerSocket serverSocket new ServerSocket(9090);// 在设备上配置的服务端监听端口为9090e…...

计算机中信息的表示和处理 整数和小数的二进制表示

信息的表示和处理整数进制字移位运算无符号数和有符号数加法运算小数定点表示IEEE 浮点表示规格化和非规格化舍入浮点运算现代计算机存储和处理的信息以二值信号表示&#xff0c;这些二进制数字称为位&#xff0c;为什么要用二进制来进行编码&#xff1f;因为二进制只有1和0两种…...

Chapter2.2:线性表的顺序表示

该系列属于计算机基础系列中的《数据结构基础》子系列&#xff0c;参考书《数据结构考研复习指导》(王道论坛 组编)&#xff0c;完整内容请阅读原书。 2.线性表的顺序表示 2.1 顺序表的定义 线性表的顺序存储亦称为顺序表&#xff0c;是用一组地址连续的存储单元依次存储线性表…...

老马闲评数字化「4」做数字化会不会被供应商拿捏住

原文作者&#xff1a;行云创新CEO 马洪喜 导语 开年过后业务特别的繁忙&#xff0c;出差也比较多&#xff0c;所以有段时间没更新了&#xff0c;对不住大家&#xff01; 上一集&#xff08;您可以查看“行云创新”主页阅读原文&#xff09;咱们聊了数字化转型的“想转、急转、…...

robosuite添加无碰撞的模型

1 前言 最近在使用robosuite时,需要在仿真环境中可视化物体的目标位置,从而方便观察训练情况,可视化的物体有以下要求: 形状尺寸与操作的物体一样半透明只有visual,不与场景其他物体有碰撞可以在每次step后设置位置,且固定在设定的位置,不受重力影响 2 方法 找了半天,最终确…...

JS学习笔记day03

今日内容 零、 复习昨日 CSS 美化,复用,样式文件和表现文件分离便于维护 选择器 {属性:值;…} 引入css 内联文件内部使用style标签外部文件 <link href"路径" rel"stylesheet" type"text/css"> 选择器 基本 idclass标签名 属性 标签名…...

离散数学笔记_第一章:逻辑和证明(3)

1.3 命题等价式1.3.1 逻辑等价式 1.3.2 条件命题和双条件命题的逻辑等价式 1.3.3 德摩根律 1.3.4 可满足性 可满足的 不可满足的 可满足性问题的解 1.3.5析取范式&#xff08;基本积之和&#xff09;&#xff0c;合取范式&#xff08;基本和之积&#xff09;1.3.6合式公式1…...

软件测试分类知识分享,第三方软件测试机构收费贵不贵?

软件测试可以很好的检验软件产品的质量以及规避产品上线之后可能会发生的错误&#xff0c;随着技术的发展&#xff0c;软件测试已经是一个完整且体系庞大的测试活动&#xff0c;不同的测试领域有着不同的测试方法、技术与名称&#xff0c;那么具体有哪些分类呢? 一、软件测试…...

爬虫(二)解析数据

文章目录1. Xpath2. jsonpath3. BeautifulSoup4. 正则表达式4.1 特殊符号4.2 特殊字符4.3 限定符4.3 常用函数4.4 匹配策略4.5 常用正则爬虫将数据爬取到后&#xff0c;并不是全部的数据都能用&#xff0c;我们只需要截取里面的一些数据来用&#xff0c;这也就是解析爬取到的信…...

【C++、C++11】可变参数模板、lambda表达式、包装器

文章目录&#x1f4d6; 前言1. 可变参数模板1.1 万能模板&#xff1a;1.2 完美转发&#xff1a;1.3 可变参数模板的使用&#xff1a;1.4 emplace_back&#xff1a;2. lambda表达式2.1 lambda表达式的定义&#xff1a;2.2 lambda表达式的用法&#xff1a;2.2 - 1 捕捉列表的用法…...

外贸主机测评

一、俄罗斯vps 服务商&#xff1a; JUSTG: Home - Sun Network Company Limited LOCVPS: LOCVPS 全球云 - 十年老牌 为跨境外贸/远程办公/网站建设提供澎湃动力 JUSTHOST: justhost.ru RUVDS: Gcorelabs: 二、主机测评指标&#xff1a; 1、速度、延迟、丢包、路由测试…...

Meta CTO:Quest 2生命周期或比预期更久

前不久&#xff0c;Meta未来4年路线图遭曝光&#xff0c;泄露了该公司正在筹备中的一些AR/VR原型。除此之外&#xff0c;还有消息称Quest Pro或因销量不佳&#xff0c;而不再迭代。毫无疑问&#xff0c;Meta的一举一动持续受到行业关注&#xff0c;而面对最近的爆料&#xff0c…...

Vector - CAPL - 文件处理函数

在当前平台化的趋势下,就算是协议层测试依然需要适配各种各样的项目,也需要处理各类型的文件,那我们如何对文件进行读取、写入、修改等类型的操作呢?今天我们就会介绍此类型的函数,主要适用于text、bin文件的处理。 打开文件 Open...

实力加持!RestCloud完成多方国产化适配,携手共建信创生态

近年来&#xff0c;随着数字化建设进入深水区&#xff0c;企事业单位对信息安全重视程度与日俱增&#xff0c;核心技术自主可控已成为时代呼唤&#xff0c;国产化浪潮日益汹涌澎湃。近日&#xff0c;RestCloud在国产化方面取得新进展&#xff0c;完成了全部产品线信创环境的多方…...

Unity 3D GUI教程||OnGUI TextArea 控件||OnGUI ScrollView 控件

OnGUI TextArea 控件 Unity 3D TextArea 控件用于创建一个多行的文本编辑区。用户可以在多行文本编辑区编辑文本内容。 该控件可以对超出控件宽度的文本内容实现换行操作。 TextArea 控件同样会将当前文本编辑区中的文本内容以字符串形式返回。 开发人员可以通过创建 Strin…...

Leetcode.828 统计子串中的唯一字符

题目链接 Leetcode.828 统计子串中的唯一字符 Rating &#xff1a; 2034 题目描述 我们定义了一个函数 countUniqueChars(s)来统计字符串 s中的唯一字符&#xff0c;并返回唯一字符的个数。 例如&#xff1a;s "LEETCODE"&#xff0c;则其中 "L", "…...

Hibernate 相关特性

1. Hibernate一般使用hql进行查询&#xff0c;但也有sql执行的方法 Native sql 查询,。需要注意的是&#xff0c;使用Native SQL查询可能会破坏Hibernate的缓存机制&#xff0c;并可能导致性能问题 String sql "SELECT * FROM users WHERE age > :age"; Query …...

【研究生学术英语读写教程翻译 中国科学院大学Unit1-Unit8】

Unit1 Descartes Was Wrong 笛卡尔错了:“他人在,故我在” Unit2 Are we ready for the next volcanic catastrophe?我们准备好应对下一次火山灾难了吗? Unit3 Theorists,experimentalists and the bias in popular physics理论家,实验家和大众物理学的偏见 unit4 Magic Nu…...

ListView 控件的使用

第一步&#xff1a;找到ListView的控件通过findViewById 找到ListView的控件 ListView listView findViewById(R.id.listView);第二步&#xff1a;创建Bean类 得到set和get的方法解析获取的数据创建Bean类 得到set和get的方法public class Bean {String nanm""; pub…...

域控制器搭建以及成员加入

需要iso&#xff1a;windows server 2016软件使用&#xff1a;vmwarewindows server 2016系统搭建自己选iso&#xff0c;一直下一步就可以安装完成。&#xff08;记得要设置密码&#xff09;&#xff08;密码要求大小写字母数字符号&#xff09;等待就能安装完成。安装和配置Ac…...