Java_数组

数组

1.概念

需求:现在需要统计软件技术1班47名同学的成绩情况,例如计算平均成绩、最高成绩等。如果只能使用变量的话,那么需要定义100个变量,这样就比较复杂了。这时我们就可以使用数组来记住这47名同学的成绩,然后使用数组来操作就可以了。

概念:数组(Array)是用于存储多个相同数据类型集合。想要获取数组的值,可以通过下标来获取,下标是从0开始的

image-20230210215313251

2.创建数组

​ 创建数组的方式一般分为:动态初始化静态初始化两种方式。

2.1.动态初始化

  • 新建int[],长度是5

  • 刚创建好的数组都是默认值0,int类型的数据默认值是0

  • 把数组的地址值给变量a保存

int[] a = new int[5];

image-20230210215744657

2.2.静态初始化

静态初始化只创建有初始值的方式,分为以下两种方式:

int[] a ={1,2,3,4,5,6,7,8};
int[] a =new int[]{1,2,3,4,5};

创建好的数组可以通过length()方法获取它的长度,数组一旦创建,长度不可改变,允许0长度的数组。

练习:数组存入hello。

package cn.sccs.array;

//这个类用来测试 数组的创建
public class Test6_Array {
	public static void main(String[] args) {
		//1、创建数组 ,存入hello
		//--静态初始化 :一开始刚创建好时,存的都是默认值,char类型默认值是\u0000。
		char[] a = new char[] { 'h' , 'e' , 'l' ,'l' ,'o'  } ;
		char[] b = {  'h' , 'e' , 'l' ,'l' ,'o'  } ; 
		
		//--动态初始化,需要在创建数组的同时,指定长度!!
		char[] c = new char[5];
		c[0] = 'h' ; //把下标为0的数据,从默认值\u0000改为'h'
		c[1] = 'e' ;//把下标为1的数据,从默认值\u0000改为'e'
		c[2] = 'l' ;//把下标为2的数据,从默认值\u0000改为'l'
		c[3] = 'l' ;//把下标为3的数据,从默认值\u0000改为'l'
		c[4] = 'o' ;//把下标为4的数据,从默认值\u0000改为'o'
		
		//数组的长度如果是5,下标最大值是4的话,有没有下标为5的元素---没有!!!
		//java.lang.ArrayIndexOutOfBoundsException:原因就是访问了不存在的下标5
		//c[5] = 'x';
		
		System.out.println(a.length);
		System.out.println(b.length);
		System.out.println(c.length);
	}
}
public class ArrayTest01 {
    public static void main(String[] args) {
        /*
        * 数组的索引从下标0开始,访问元素通过数组名[index]
        * 数组都具有默认值: 
        *   int:0
        *   float:0.0
        *   string: '\u0000'
        *   boolean:false
        *   引用类型:null
        * 数组注意事项:
        *   1.直接打印数组名是一个地址值
        *   2.访问数组元素时,不能下标越界
        *   3.如果数组没有任何引用,那么数组将出现空指针异常
        * */
        int[] arr = new int[5];
        System.out.println(arr); // [I@776ec8df
        System.out.println(arr[0]);
        
        arr[0] = 10;
        System.out.println(arr[0]);
        
        arr = null;
        System.out.println(arr[0]);  // NullPointerException
    }
}

以上代码对应内存:

3.数组的常见操作

3.1.数组的遍历

​ 遍历指:从头到尾,依次访问数组中元素的位置。

  • 形式:
for(int i=0;i<a.length;i++){
       syso(a[i]);
}

练习1:输出每个月的天数。

public static void method() {
		//1、创建数组,存放12个数字
		int[] a = { 31,28,31,30,31,30,31,31,30,31,30,31  };
//		System.out.println(a[0]);
//		System.out.println(a[1]);
//		System.out.println(a[2]);
//		System.out.println(a[3]);
		
		//2、遍历数组
		//int i = 0  是指从下标0开始  ,i表示下标
		// i <= a.length-1 是指下标最大值是数组的长度-1
		//i++   是指下标依次递增,向后遍历数据
		for( int i = 0 ; i <= a.length-1 ; i++ ){  
			//3、a[i]是指根据下标i获取a数组中的元素  
//			System.out.println( a[i] );
			//数组一共12个数字,i的变化就是0-11,那么i+1就能获取1-12月了
			System.out.println(  i+1  +"月有"+a[i]+"天" );
		}
		
	}

练习2:遍历数组,存入1到10。

public class Test7_数组遍历 {

       public static void main(String[] args) {
			int[] arr=new int[10];
             for (int i = 0; i < arr.length; i++) {
                     arr[i]=i+1;
              }
			System.out.println(Arrays.toString(arr));
       }
}

练习3:创建随机数组。

import java.util.Arrays;
import java.util.Random;

public class t {
       public static void main(String[] args) {
              int[] a = new int[5];
              for (int i = 0; i < a.length; i++) {
                     a[i]=1+new Random().nextInt(100);
              }
              System.out.println(Arrays.toString(a));
       }
}

3.2.求数组中的最大值

​ 求数组中的最大值的思路:

  1. 创建一组数组;
  2. 定义零时变量max,假定它是数组的第一个元素,且是最大的;
  3. 判断它和下一个元素谁大,将最大值交给变量max。
// 求数组最大值
public class ArrayTest02 {
    public static void main(String[] args) {
        int[] arr = {123,456,99,111,88,223};
        // 定义初始化变量
        int max = arr[0];

        for (int i = 0; i < arr.length; i++) {
            // 判断最大值
            if (arr[i] > max) {
                max = arr[i];
            }
        }
        System.out.println("数组中最大值是:" + max);
        
    }
}

3.3.数组的排序

​ 数组常用的排序方式有3种:选择法排序、冒泡法排序、快速排序(工具类Arrays)。

  • **冒泡排序:**相邻位置比较,从小到大排序,如果小就往前换。i代表从头到尾遍历循环数据。

image-20230211223530794

// 冒泡排序
public class ArrayTest03 {

    public static void main(String[] args) {
        
        int[] arr = {4,1,5,2,3};
        // 升序 1,2,3,4,5 比较次数=元素个数-1
        for (int i = 0; i < arr.length - 1; i++) {
            // -i是随着i的自增而减少
            for (int j = 0; j < arr.length -1 - i; j++) {
                // 判断相邻元素的比较
                if (arr[j] > arr[j+1]) {
                    // 定义临时变量记住j上的元素
                    int temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
        }
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
        // 降序?--将大于改为小于
    }
}

4.多维数组

​ 在程序中可以通过一个数组来保存某个班级学生的成绩,试想一下,如果要统计一下一个学校各个班级学生的成绩,又该如何实现呢?

​ 这种场景我们就要使用多维数组的方式去实现了。而最常见的多维数组是二维数组。

4.1.定义格式

​ 与一维数组相同,二维数组的定义格式也分为静态初始化和动态初始化。格式为:

  • 动态初始化:
数据类型[][] 数组名 = new 数据类型[长度1][长度2];
  • 静态初始化:
数据类型[][] 数组名 = {{元素1,元素2},{元素3,元素4},{元素5,元素6}};
// 二位数组
public class ArrayTest04 {

    public static void main(String[] args) {
        // 创建长度为3的二维数组,保存了3个一维数组,每个一位数组有2个元素
        int[][] arr = {{1,2},{3,4},{5,6}};
        System.out.println(arr);  // [[I@776ec8df
        System.out.println(arr[0]);  // [I@4eec7777 通过0索引拿到第一个一维数组
        // 通过索引获取元素
        System.out.println(arr[0][0]);
    }
}

以上代码内存示意图:

image-20230213110435538

4.2.二维数组的常用操作

  • 遍历
// 遍历
for (int i = 0; i < arr.length; i++) {
    for (int j = 0; j < arr[i].length; j++) {
        System.out.println(arr[i][j]);
    }
}
  • **练习:**需求如下:
    • 定义一个二维数组,二维数组中每个一维数组保存了每个班级的分数
    • 统计每个班级的总分数
    • 统计所有班级的总分数
// 二维数组统计班级总分数
public class ArrayTest05 {
    public static void main(String[] args) {
        int[][] arr = {{89,78,90,100},{98,97,67,88},{76,83,88,95}};
        int total = 0; // 定义所有班级的总分数求和变量
        for (int i = 0; i < arr.length; i++) {
            int sum = 0; // 定义求和初始化变量
            for (int j = 0; j < arr[i].length; j++) {
                sum += arr[i][j]; 
            }
            // 单个班级的总分数
            System.out.println("第"+ (i+1) + "班的总分数为" + sum);
            total += sum;
        }
        System.out.println("所有班级的总分数为:" + total);
    }
}

5.数组API–Arrays

​ 关于数组的操作,Java给我们提供了一个工具类Arrays,我们可以用它实现一些关于数组的简便操作。Arraysjava.util.Arrays;包中。它的常用方法如下:

5.1.toString()方法

  • Arrays.toString()方法:快速以字符串的形式输出数组元素。
int[] a = {3,4,1,2,5,6};
System.out.println(Arrays.toString(a));  // [3, 4, 1, 2, 5, 6]

5.2.sort()方法

  • **Arrays.sort()方法:**给数组排序,默认升序。该方法有如下两种重载方式:

    • Arrays.sort(数组名): 以升序方式给数组排序
    int[] a = {3,4,1,2,5,6};
    Arrays.sort(a);
    System.out.println(Arrays.toString(a));  // [1, 2, 3, 4, 5, 6]
    / 降序-需要使用包装类
    Integer[] arr01 = {3,4,1,2,5,6};
    Arrays.sort(arr01, Collections.reverseOrder());
    System.out.println(Arrays.toString(arr01));
    
    • Arrays.sort(数组名,起始下标,排序个数):自定义区间排序
    // 区间排序
    int[] arr = {1,4,3,8,2,9,11,3};
    Arrays.sort(arr,2,5);
    System.out.println(Arrays.toString(arr)); // [1, 4, 2, 3, 8, 9, 11, 3]
    

5.3.equals()方法

  • **Arrays.equals()方法:**比较两个数组内容是否相等。
int[] x = {1,2,3};
int[] y = {3,2,1};
System.out.println(Arrays.equals(x,y));  // false

注意:Arrays.equals()是比较数组内容,而a.equals(b) 这样的方法是比较地址值。

以后使用java提供的引用数据内容(数组、字符串、各种集合....)时,一定要用equals()方法比较内容是否相等,而不是傻傻的用 ==了!因为官方已经把equals()给重写了。如果你要比较你自己写的类,例如学生按成绩排序,就要自己重写equals()方法

5.4.binarySearch()方法

  • Arrays.binarySearch(数组名,要查找的值)方法:在数组中查找元素,只要返回值>=0就表示已经找到,若没找到,则返回插入点-1_(插入点为这个数值应放入的位置)。
int[] arr03 = {1,5,6,7};
System.out.println(Arrays.binarySearch(arr03,1)); // 0
System.out.println(Arrays.binarySearch(arr03,3)); // -2

5.5.copyOf()方法

  • Arrays.copyOf()方法:拷贝数组。参数有两个,第一个为原数组,第二个为拷贝长度。返回值为新数组。
int[] arr04 = {1,3,5,7,8,9,10};
int[] arr05 = Arrays.copyOf(arr04,5);
System.out.println(Arrays.toString(arr05));

若没找到,则返回插入点-1_(插入点为这个数值应放入的位置)。

int[] arr03 = {1,5,6,7};
System.out.println(Arrays.binarySearch(arr03,1)); // 0
System.out.println(Arrays.binarySearch(arr03,3)); // -2

5.5.copyOf()方法

  • Arrays.copyOf()方法:拷贝数组。参数有两个,第一个为原数组,第二个为拷贝长度。返回值为新数组。
int[] arr04 = {1,3,5,7,8,9,10};
int[] arr05 = Arrays.copyOf(arr04,5);
System.out.println(Arrays.toString(arr05));

IDE

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值