【01 Java 语言基础:8. 数组】

8. 数组

8.1 一维数组

格式:数据类型[] 数组名称=new 数据类型[数组长度]

1)概念和特点

**概念:**是一种容器,可以同时存放多个数据值;

特点:

  1. 数组是一种引用数据类型
  2. 数组当中的多个数据,类型必须统一
  3. 数组的长度在程序运行期间不可改变
2)数组的使用
public class ArrayTest{
    public static void main(String[] args) {
        //1.声明一个长度为2,类型为int的数组
        //int arr[]=new int[2];		//两种声明方式从结果上来说没有区别,C语言和C++上是这样声明的
        int[] arr=new int[2];		//推荐使用这种,提高了代码的可读性
        
        //2.打印输出数组的长度和元素
        System.out.println("数组的长度为:"+arr.length);	//2;下标是从0~1
        System.out.println("下标为0的元素是:"+arr[0]);		//0		数组的下标是0~本身减1
        System.out.println("下标为1的元素是:"+arr[1]);		//0		int默认值是0
//System.out.println("下标为1的元素是:"+arr[1]);//编译ok,运行出现数组索引越界异常:ArryIndexOutOfBoundsException
        
        //3.使用for循环打印数组的元素
        for(int i=0;i<arr.length;i++) {
            System.out.println("下标为:"+i+"的元素是:"+arr[i]);
        }
    }
}
3)数组的初始化

基本类型的数组(数据元素为基本类型)创建后,

元素的初始值:

byte、short、char、int、long为0;

float和double为0.0;

boolean为false;

String为null;

格式:

**动态:**数据类型[] 数组名称 = new 数据类型 [数组长度];

int[] arrayA = new int[300];	///创建一个数组,里面可以存放300个int数据

静态:

标准格式:数据类型[] 数组名称 = new 数据类型 [] {元素1,元素2…};

int[] arrayA = new int[]{5, 15, 25};	//直接创建一个数组,全是int数据(5,15,25)

省略格式:数据类型[] 数组名称 ={元素1,元素2…};

 String[] arrayB = new String[] {"Hello", "Java", "World"};	//直接创建一个数组,全是字符串(Hello,Java,World)

8.2 数组原理内存图

1)内存概述

​ 内存是计算机中的重要原件,临时存储区域,作用是运行程序。我们编写的程序是存放在硬盘中的,在硬盘中的程序是不会运行的,必须放进内存中才能运行,运行完毕后会清空内存。Java虚拟机要运行程序,必须要对内存进行空间的分配和管理。

2)Java虚拟机的内存划分
区域名称作用
寄存器给cpu使用,与开发无关
本地方法栈JVM使用操作系统功能时使用,和开发无关
方法区存储class相关信息,包含方法的信息
堆内存存储对象或者数组,new来创建的,都存储在堆内存。
栈内存存放的都是方法中的局部变量;方法的运行一定要在栈中运行。

流程

  1. main方法进入方法栈执行。
  2. 创建数组,JVM会在堆内存中开辟空间,存储数组。
  3. 数组在内存中会有自己的内存地址,以十六进制表示。
  4. JVM将数组的内存地址赋值给引用类型变量。
  5. 变量保存的是数组内存中的地址,而不是一个具体的数值,因此被称为引用数据类型。

8.3 数组的增删改查

• 声明一个长度为5元素类型为int类型的一维数组,打印数组中所有元素值;

public class ArrayOpTest {
    public static void main(String[] args) {
        //声明
        int[] arr=new int[5];
        //打印
        System.out.print("数组中的元素有:");
        for(int i=0;i<arr.length;i++) {		//length=5;所以i<5
            System.out.print(arr[i]+" ");
        }
    }
}

• 使用元素11、22、33、44分别对数组中前四个元素赋值后再次打印;

System.out.println();
//接上

//方式一
System.out.print("数组中的元素有:");
arr[0]=11;
arr[1]=22;
arr[2]=33;
arr[3]=44;
for(int i=0;i<arr.length;i++) {		//length=5;所以i<5
            System.out.print(arr[i]+" ");
        }

//方式二
//先赋值
for(int i=0;i<arr.length-1;i++) {
    arr[i]=(i+1)*11;
}
//再打印
System.out.print("数组中的元素有:");
        for(int i=0;i<arr.length;i++) {		//length=5;所以i<5
            System.out.print(arr[i]+" ");
        }

• 将元素55插入到下标为0的位置,原有元素向后移动,再打印所有元素值;

//接上

//方式一
//先赋值
arr[4]=arr[3];
arr[3]=arr[2];
arr[2]=arr[1];
arr[1]=arr[0];
arr[0]=55;
//再打印
System.out.print("数组中的元素有:");
        for(int i=0;i<arr.length;i++) {		//length=5;所以i<5
            System.out.print(arr[i]+" ");
        }

//方式二:
for(int i=arr.length-1;i>0;i--) {
    arr[i]=arr[i-1];
} arr[0]=55;
System.out.print("数组中的元素有:");
        for(int i=0;i<arr.length;i++) {		//length=5;所以i<5
            System.out.print(arr[i]+" ");
        }

• 将元素55从数组中删除,删除方式为后续元素向前移动,最后位置置为0并打印;

//接上
//先赋值
for(int i=0;i<arr.length-1;i++) {
    arr[i]=arr[i+1];
} arr[4]=0;
System.out.print("数组中的元素有:");
        for(int i=0;i<arr.length;i++) {		//length=5;所以i<5
            System.out.print(arr[i]+" ");
        }

• 查找数组中是否存在元素22,若存在则修改为220后再次打印所有元素;

//打印
System.out.print("数组中的元素有:");
        for(int i=0;i<arr.length;i++) {		//length=5;所以i<5
            if(arr[i]==22) {
                arr[i]=220;
            }
            System.out.print(arr[i]+" ");
        }
1)数组的copy
public class ArrayCopyTest {
    public static void main(String[] args) {
    //1、声明一个初始值为11 22 33 44 55的一维数组并打印所有元素
    int[] arr={11,22,33,44,55};
    System.out.print("第一组数组的数据是:");
    for(int i=0;i<arr.length;i++) {
        System.out.print(arr[i]+" ");
    } System.out.println();
    
    //2、声明一个长度为3元素类型为int类型的一维数组并打印所有元素
    int[] brr=new int[3];
    System.out.print("第二组数组的数据是:");
    for(int i=0;i<brr.length;i++) {
        System.out.print(brr[i]+" ");
    } System.out.println();
    
    //3、实现将第一个数组中间3个元素赋值到第二个数组中
        //方式一
        brr[0]=arr[1];
        brr[1]=arr[2];
        brr[2]=arr[3];
        System.out.print("第二组数组的数据是:");
    	for(int i=0;i<brr.length;i++) {
        	System.out.print(brr[i]+" ");
    	} System.out.println();
        //方式二
        for(int i=0;i<brr.length;i++) {
            brr[i]=arr[i+1];
        }
        System.out.print("第二组数组的数据是:");
    	for(int i=0;i<brr.length;i++) {
        	System.out.print(brr[i]+" ");
    	} System.out.println();
        //方式三
        //表示将数组arr下标从1开始的3个元素复制到数组brr下标从0开始的位置
        System.arraycopy(arr,1,brr,0,3);
        System.out.print("第二组数组的数据是:");
    	for(int i=0;i<brr.length;i++) {
        	System.out.print(brr[i]+" ");
    	} System.out.println();
        
        
        //注意事项!!!
        //表示将数组arr的数值赋值给数组brr,覆盖变量brr中原来的数值
        //数组名arr的内存空间中存放的是数据在堆区中的内存地址信息,赋值后让brr存放了arr所指向堆区的内存地址
        //也就是让brr和arr指向了同一块堆区地址,所以本质上就是改变了指向
        //原来地址的堆空间会被自动释放
        brr=arr;
     System.out.print("第二组数组的数据是:");
    	for(int i=0;i<brr.length;i++) {
        	System.out.print(brr[i]+" ");	//11,22,33,44
    	} System.out.println();       
  }
}

8.4 数组的工具类

java.util.Arrays类可以实现对数组中元素的遍历、查找、排序等操作。

打印

格式:Arrays.toString(数组名)

用法:System.out.println("第一个数组的元素有:"+Arrays.toString(arr1));

//实现工具类的使用
public class ArraysTest {
    public static void main(String[] args) {
        //1、声明一个初始值:10,20,30,40,50的一维数组
        int[] arr1={10,20,30,40,50};
        
        //2、使用原始方式打印数组的元素,要求打印格式为:[10,20,30,40,50]
        System.out.print("第一个数组的元素有:[");
        for(int i=0;i<arr1.length;i++) {
            //如果打印的元素是最后一个时,直接打印它本身即可
            if(i==arr1.length-1) {
                System.out.print(arr1[i]);
            
            //否则打印元素后面加“,”
            } else {
                System.out.print(arr1[i]+",");
            }
        }
        System.out.println("]");
        //3、使用数组工具类实现数组中所有元素的打印
        //!!!
        //Arrays.toString(数组名);
        System.out.println("第一个数组的元素有:"+Arrays.toString(arr1));
    }
}
填充

格式:Arrays.fill(数组名,元素);

用法:Arrays.fill(arr2,10);

public class ArraysTest {
    public static void main(String[] args) {
        //1、定义一个数组
        int[] arr1={10,20,30,40,50};
        //2、打印
        System.out.println("第一个数组的元素有:"+Arrays.toString(arr1));	//[10,20,30,40,50]
        
        //填充
        //定义一个长度为5的数组
        int[] arr2=new int[5];
        //使用10来填充数组arr2的每个元素,每个元素都赋值为10
        
        //Arrays.fill(数组名,元素);
        Arrays.fill(arr2,10);
        System.out.println("第二个数组的元素有:"+Arrays.toString(arr2));	//[10,10,10,10,10]
    }
}
比较

格式:Arrays.equals(数组名1,数组名2)

用法:System.out.println(Arrays.equals(arr2,arr3)); //false true

//接上
int[] arr3=new int[5];
Arrays.fill(arr3,10);
System.out.println("第三个数组的元素有:"+Arrays.toString(arr3));	//[10,10,10,10,10]

//比较
//Arrays.equals(数组名1,数组名2)
System.out.println(Arrays.equals(arr2,arr3));//true

//修改数组中的元素
arr2[4]=20;
System.out.println("第二个数组的元素有:"+Arrays.toString(arr2));	//[10,10,10,10,20]
System.out.println(Arrays.equals(arr2,arr3));//false
//修改顺序
arr3[3]=20;
System.out.println("第三个数组的元素有:"+Arrays.toString(arr3));	//[10,10,10,20,10]
System.out.println(Arrays.equals(arr2,arr3));//false
排序

格式:Arrays.sort(数组名);

使用:Arrays.sort(arr);

int[] arr={30,10,20};
Arrays.sort(arr);
System.out.println("这个数组的元素有:"+Arrays.toString(arr));	//[10,20,30]
System.out.println("最小的元素是:"+arr[0]+",最大的元素是:"+arr[arr.length-1]);
查找

格式:Arrays.binarySearch(数组名,需要查找的元素)

使用:Arrays.binarySearch(arr,30)

int[] arr={30,10,20};
System.out.println("元素30在数组的下标位置是:"+Arrays.binarySearch(arr,30));	//0
System.out.println("元素29在数组的下标位置是:"+Arrays.binarySearch(arr,29));	//负数;	无效下标

8.5 二维数组

1)概念

二维数组本质上就是由多个一维数组摞在一起组成的数组,二维数组中的每个元素都是一维数组,而一维数组中的每个元素才是数据内容。
在这里插入图片描述

2)二维数组的声明和使用

声明格式:数据类型[][] 数组名称 = new 数据类型[行数][列数];

数据类型[][] 数组名称 = {{元素1, 元素2,...}, ...};

public class ArraysTest {
    public static void main(String[] args) {
        //1、声明一个2行3列int类型的二维数组
        int[][] arr=new int[2][3];
        //2、打印数组
        //外层打印行数
        for(int i=0;i<arr.length;i++) {
            //内层打印数组的列数
            for(int j=0;j<arr[i].length;j++) {
                System.out.print(arr[i][j]+" ");	//全是0
            }
            System.out.println();
        }
        
        //2、实现数组的赋值
        int cnt=1;
        for(int i=0;i<arr.length;i++) {    
            for(int j=0;j<arr[i].length;j++) {
                arr[i][j]=cnt++;
            }
         }
        for(int i=0;i<arr.length;i++) {
            //内层打印数组的列数
            for(int j=0;j<arr[i].length;j++) {
                System.out.print(arr[i][j]+" ");	//1 2 3   4 5 6 
            }
            System.out.println();
        }
        
        //3、初始化数组的赋值
        int[][] brr={{1,2,3},{1,2,6}};
         for(int i=0;i<brr.length;i++) {
            //内层打印数组的列数
            for(int j=0;j<brr[i].length;j++) {
                System.out.print(arr[i][j]+" ");	//1 2 3   1 2 6 
            }
            System.out.println();
        }
        
        //!!!
        //考点
        //创建一个3行不知道多少列的二维数组
        int[][] crr=new int[3][];
        //第1行有3列
        crr[0]=new int[3];
        //第2行有5列
        crr[1]=new int[5];
        //第3行有6列
        crr[2]=new int[6];
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

江桥诗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值