数组的定义与使用--(java)

时间:2023-03-13 13:05:03

1.数组的基本概念✨✨☀

1.1什么是数组‼

数组:????以看成是相同类型元素的一个集合。在内存中是一段连续的空间。例如下面的车位????????

数组的定义与使用--(java)

从上图可以看到:

1.数组中存放的元素类型相同

2.数组的空间是连在一起的

3.每个空间都有自己的编号

1.2搞数组的创建及初始化????

第一种 int[]array={1,2,3,4,5}//创建并且初始化,与第二种更加简便
第二种 int[]array2=new int[]{1,2,3,4,5}//用new int创建一块空间,并且进行初始化,与第一种相比没有区别,只是写法上不同
第三种 int[]array3=new int[5]//与一二种相比第三种没有初始化,但是比较灵活可以随意定义在范围内的下标的值

注意????????????

1像第一、二种int[]中的括号里面不能有数字

2第三种的有与没有初始化,里面存放的都是0

数组的定义与使用--(java)

3当下标访问越界时,会发成异常

数组的定义与使用--(java)

4 int[]array4;

  array4={1,2,3,4};

不能进行这样初始化,当整体初始化的时候,只能在定义的时候初始化!!

正确的方式 int[]array4;array4=new int{1,2,3,4}


5如果没有对数组进行初始化,数组中的元素有其默认值(特殊的3个)

数组的定义与使用--(java)

1.3数组的使用????

1.3.1数组中元素的访问



int[]array={1,2,3,4,5};
System.out.println(array[0]);//访问
array[0]=99;//访问->写数据



注意????????

1数组是一段连续的内存空间,因此支持的是随机访问,即通过下标访问快速访问数组中任意位置的元素

2下标从0开始,介于[0,N)之间不包含N,N为元素个数,不能越界

1.3.2遍历数组

第一种(for)

数组的定义与使用--(java)

注意????(.length)????以来获得数组的长度

第二种(for-each)

数组的定义与使用--(java)

(增强for循环)遍历array把里面的元素每个都取出来放到x里面

第三种(java原生工具)

数组的定义与使用--(java)

Arras.toString(array);//java帮你实现打印数组的方法

比较????

当使用下标的时候需要用for循环,不要就使用for-each

2.数组是引用类型????

2.1初始JVM的内存分布

内存是一段连续的存储空间,主要用来存储程序运行时数据的。

当java运行时的数据区如下????????

方法区

程序计时器


虚拟机栈

本方法栈

主要介绍虚拟机栈

虚拟机栈(JVM Stack):与方法调用相关的一些信息,每个方法在执行时,都会先创建一个栈帧,栈帧中包含有:局部变量表、操作数栈、动态链接、返回地址以及其他的一些信息,保存的都是与方法执行时相关的一些信息。比如:局部变量。当方法运行结束后,栈帧就被销毁了,即栈帧中保存的数据也被销毁了。

堆(Heap):JVM所管理的最大内存区域。使用new创建的对象都是在堆上保存,堆是随着程序运行时而创建,随着程序的退出而销毁,堆中的数据只要还有在使用,就不会被销毁。

2.2基本类型变量与引用类型变量的区别????????????????

基本数据类型创建的变量,称为基本变量,该变量空间中直接存放的是其所对应的值;

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

public static void fun(){
int a=10;
int b=20;
int[]arr=new int[]{1,2,3};

由上面????知,a,b,arr,都是函数内部的变量,因此其空间都在main方法对应的栈帧中。

a,b是内置类型的变量,因此空间中保存的就是给该变量初始化的值。

array是数组类型的引用变量,其内部保存的内容????以简单理解成是数组在堆空间中的首地址。如下图

数组的定义与使用--(java)

数组的定义与使用--(java)

由上图所得????以看到,引用变量并不直接存储对象本身,????以简单理解成存储的是对象在堆中的空间的起始地址,引用变量便????以去操作对象。

2.3认识null????

null在java中为“空指针”,就是一个不指向对象的引用

数组的定义与使用--(java)

NullPointerException->表示空指针异常

3.数组的应用????????

3.1保存数据

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

代码结果

数组的定义与使用--(java)

3.2作为函数的参数

3.2.1参数传基本数据类型

public static void main(String[] args){

int num=0;

func(num);

System.out.println("num="+num);

}

public static void func(int x){

x=10;

System.out.printlin("x="+x);

}

数组的定义与使用--(java)

由上面所得在方法中修改形参x的值,不影响实参的num值

3.2.2参数传数组类型(引用数据类型)

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

数组的定义与使用--(java)

在方法内部修改数组的内容,可以使方法外部的数字也发生改变,3.2.1与3.2.2的区别就是数组是属于引用类型,3.2.2是按照引用类型进行传递,是可以修改其中存放的内容的

注意????????
public static void main(String[] args){
int[]array={1,2,3,4,5};
System.out.println("前:"+Arrays.toString(array);
func1(array);
System.out.println("后:"+Arrays.toString(array);
}
public static void func1(int[] array){
array=new int[]{9,8,7,6};
}

数组的定义与使用--(java)

但是当是此种情况下,在方法内部修改数组的内容,方法外的数字是不会改变的,当array=new int[]{9,8,7,6}表示是指形参指向了一个新的对象当走出方法的时候形参传递的内容也就消失了,实参还是原来的实参。

因此传引用不一定能改变实参的值,

3.3作为函数返回值

public static void(String[] args){
int[] array={1,2,3,4,5};
int[] ret=fun2();
System.out.println(Arrays.toString(array));
}
public static int[] fun2(){
return new int[]{111,222};
}

数组的定义与使用--(java)

4.数组的联系????????

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

以升序数组为例,二分查找的思路是先取中间位置的元素,然后使用待查找元素与数组,然后使用待查找元素与数组中间元素进行比价:

1如果相等,即找到了返回该元素在数组中的下标

2如果小于,以类似方式到数组左半侧查找

3如果大于,以类似方式到数组右半侧查找

public class newSotr {
public static void main(String[] args) {
int[]arr={1,2,3,4,5,6};
System.out.println(binarySearch(arr,6));
}
public static int binarySearch(int[]arr,int toFInd){
int left=0;
int right=arr.length-1;
while(left<=right){
int mid=(left+right)/2;
if(toFInd<arr[mid]){
//去左侧区间找
right=mid-1;
}else if(toFInd>arr[mid]){
//去右侧区间找
left=mid+1;
}else {
//相等,说明找到了
return mid;
}
}
//循环结束
return -1;
}
}

数组的定义与使用--(java)

注????:当数组越大元素越多的时候,二分的优先就越大。但是,必须是在有序的数组之下

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

给定一个数组,再给一个元素,找出该元素在的数组中的位置

public class newSotr {
public static void main(String[] args) {
int[]arr={1,2,3,10,5,6};
System.out.println(binarySearch(arr,10));
}
public static int binarySearch(int[]arr,int data){
for(int i=0;i<arr.length;i++){
if(arr[i]==data){
return i;
}
}
return -1;//表示没有找到
}
}

4.3数组排序(冒泡排序)

算法思路:

假设排升序:

1.将数组中相邻元素从前往后以此进行比较,如果前一个元素比后一个元素大,则交换,一躺下来后最大元素就在数组的未尾

2.依次从上过程,直到数组中所以的元素都排列好

import java.util.Arrays;
public class newSotr {
public static void main(String[] args) {
int[]arr={9,5,2,7};
bubbleSort(arr);
System.out.println(Arrays.toString(arr));
}
public static void bubbleSort(int[]arr){
for(int i=0;i< arr.length;i++){
for (int j=1;j<arr.length-i;j++){
if(arr[j-1]>arr[j]){
int tmp=arr[j-1];
arr[j-1]=arr[j];
arr[j]=tmp;
}
}
}
}
}

数组的定义与使用--(java)

????????????注意java中内置了更高效的排序算法

import java.util.Arrays;
public class newSotr {
public static void main(String[] args) {
int[]arr={9,5,2,7};
Arrays.sort(arr);
System.out.println(Arrays.toString(arr));
}
}

数组的定义与使用--(java)

4.4求数组中元素的平均值????????

public class newSotr {
public static void main(String[] args) {
int[]arr={1,2,3,4,5,6};
System.out.println(avg(arr));
}
public static double avg(int[]arr){
int sum=0;
for (int x :
arr) {
sum+=x;
}
return (double) sum/(double) arr.length;
}
}

数组的定义与使用--(java)

5.二维数组

二维数组本质上就是一维数组,只不过每个元素又是一个一维数组

第一种 int[][]array1={{1,2,3},{4,5,6}
第二种 int[][]array2=new int[2][3];
第三种 int[][]array3=new int[][]{{1,2,3},{4,5,6}}

遍历二维数组

public class newSotr {
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.print(arr[i][j]+" ");
}
System.out.println();
}
}
}

数组的定义与使用--(java)

二维数组的用法和一维数组并没有明显差别

结束????????

数组你学会了吗????‍????????‍????

欣赏一下美景????????

数组的定义与使用--(java)