数组

一、数组的基本概念

数组是一组类型相同的数据的集合;也就是说,数组中可以存储多个数据,但是这些数据的类型必须相同;

数组能够作为数据的容器使用,把多个数据集中存储;

存储在数组中的数据,都有相应的索引值,可以方便获取或修改;

当需要同时保存多个类型相同的变量并进行处理时,可以考虑用数组,例如:多个人的成绩、多个员工的薪资……

二、数组的声明、创建与初始化

Java的数组本身是引用数据类型;但是可存储基本数据类型,也可存储引用数据类型

数组元素类型 [] 数组名;  示例:int[] a;   推荐使用,避免混淆

数组元素类型 数组名 [];  示例:int a [];

注意:元素类型指的是数组里面存的数据类型。

  数组在声明后还只是一个空指针,不能使用,要想使用必须创建。

数组创建的三种方式:

①数组元素类型[] 数组名 = new 数组元素类型[数组长度];

//声明数组的同时,根据指定的长度分配内存,但数组中元素值都为默认的初始化值。 

示例:int[] arr1 = new int[5];  //arr1的长度为5,元素的值为默认值0

②数组元素类型[] 数组名 = new 数组元素类型[]{用逗号隔开元素的具体值};

//声明数组并分配内存,同时将其初始化。arr2的长度为4,元素的值为3,5,1,7

int[] arr2 = new int[]{3,5,1,7};

③数组元素类型[ ] 数组名 = {用逗号隔开元素的具体值};

int[] arr3 = {3,5,1,7}; //arr3的长度为4,元素的值为3,5,1,7

 

三、数组的使用

 

 

 

 

四、数组的遍历方式

对数组中的元素一个一个取出来使用,这个过程叫遍历;先简单理解数组遍历的循环语句,包括传统的for循环和增强for循环两种;

对数组遍历

正向(正序)遍历

反向(倒序)遍历

 

 

五、数组常见问题

数组脚标越界异常(ArrayIndexOutOfBoundsException)

int[] arr = new int[2];

System.out.println(arr[3]);

访问到了数组中的不存在的脚标时发生。

空指针异常(NullPointerException)

int[] arr = null;

System.out.println(arr[0]);

arr引用没有指向实体,却在操作实体中的元素时。

 

猜数游戏:从键盘中任意输入一个数据,判断数列中是否包含此数

思路:

  1. 声明数组
  2. 从键盘中任意输入一个数据
  3. 标志变量:false是否找到
  4. 循环数组取得每一项
  5. 判断数列中是否包含此数,将标志变量=true代表找到
  6. 循环外判断标志变量,没找到输出
import java.util.Scanner;


  public class T09数组存在某一个数 {

    public static void main(String[] args) {

        //1.声明数组

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

        //2.从键盘中任意输入一个数据

        Scanner scanner = new Scanner(System.in);

        System.out.println("请输入一个整数:");

        int num = scanner.nextInt();

        //3.标志变量:false是否找到

        boolean found=false;

        //4.循环数组取得每一项

        for (int i = 0; i < a.length; i++) {

            if (num==a[i]){//找到了

                System.out.println("在索引为"+i+"找到了"+a[i]);

                //5.判断数列中是否包含此数,将标志变量=true代表找到

                found=true;

            }

        }

        //6.循环外判断标志变量,没找到输出

        if (!found){//found==false

            System.out.println("未找到该数据");

       }

    }

}

 

 

循环录入10位顾客的年龄放到数组中,遍历数组并计算18岁以上和以下的比例

思路:

  1. 创建数组有10个元素
  2. 让用户输入10个年龄整数 用空格隔开  12 10 19
  3. 18岁以上的和变量放18岁以上的人数
  4. 使用scanner.next()循环读取用空格隔开的整数依次放入数组中
  5. 同时判断数组元素是否>18  18岁以上的和变量++
  6. (double)18岁以上的和变量/10   1-(double)18岁以上的和变量/10
import java.util.Scanner;

  public class T1018岁 {

    public static void main(String[] args) {

        //1.创建数组有10个元素

        int[] a=new int[10];

        //2.让用户输入10个年龄整数 用空格隔开  12 10 19

        Scanner scanner = new Scanner(System.in);

        //3.18岁以上的和变量放18岁以上的人数

        int sum=0;

        System.out.println("输入10个年龄整数 用空格隔开:");

        for (int i = 0; i < a.length; i++) {

            //4.使用scanner.nextInt()循环读取用空格隔开的整数依次放入数组中

            a[i]=scanner.nextInt();

            //5.同时判断数组元素是否>18  18岁以上的和变量++

            if (a[i]>18){

                sum++;

            }

        }

        //6.(double)18岁以上的和变量/10   1-(double)18岁以上的和变量/10

        double d=(double)sum/10;

        double e=1-d;

        System.out.printf("18岁以上的比例:%.2f",d);

        System.out.println();

        System.out.printf("18岁以下的比例:%.2f",e);

    }

}

 

 

六、多维数组的定义声明与初始化

(一)定义:

多维数组即数组的数组,即数组的元素也是数组

 

数组元素类型[][] 变量名称=new 数组元素类型[一维长度] [二维长度];

数组元素类型[][] 变量名称=new 数组元素类型[][]{{元素,元素,...},{元素,元素,...},...};

数组元素类型[][] 变量名称={{元素,元素,...},{元素,元素,...},...};

(二)调用二维数组指定位置的元素:

数组名称[行的索引][列的索引]

 

public static void main(String[] args) {

int[][] a={{10,20},{100,110,120,130}};

System.out.println(a[0][1]);

System.out.println(a[1][2]);

}

//输出

20

120

(三)获取二维数组的长度:

数组名称.length 行数

数组名称[索引].length 具体行的长度

public static void main(String[] args) {

int[][] a={{10,20},{100,110,120,130}};

System.out.println(a.length);

System.out.println(a[0].length);

System.out.println(a[1].length);

}

//输出

2

2

4

七、多维数组的赋值与创建过程

 

八、多维数组的遍历

使用和遍历数组

(一)指定长度

数组元素类型[][] 变量名称=new 数组元素类型[一维长度] [二维长度];

    表示数组的元素是等长的一维数组

public static void main(String[] args) {

int[][] a=new int[2][3];

a[0][0]=1;

a[0][1]=2;

a[0][2]=3;

a[1][0]=11;

a[1][1]=12;

a[1][2]=13;

//遍历二维数组

for (int i = 0; i < a.length; i++) {

for (int j = 0; j < a[i].length; j++) {

System.out.println(a[i][j]);

}

}

}

//运行结果

1

2

3

11

12

13

 

(二)不指定长度

数组元素类型[][] 变量名称=new 数组元素类型[][]{{元素,元素,...},{元素,元素,...},...};

数组元素类型[][] 变量名称={{元素,元素,...},{元素,元素,...},...};

public static void main(String[] args) {

int[][] a=new int[][]{{10,20},{100,110,120,130}};

for (int i = 0; i < a.length; i++) {

for (int j = 0; j < a[i].length; j++) {

System.out.print(a[i][j]+" ");

}

System.out.println();

}

}

输出:

10 20

100 110 120 130

public static void main(String[] args) {

int[][] a={{10,20},{100,110,120,130}};

for (int i = 0; i < a.length; i++) {

for (int j = 0; j < a[i].length; j++) {

System.out.print(a[i][j]+" ");

}

System.out.println();

}

}

输出:

10 20

100 110 120 130

public static void main(String[] args) {

int[][] a=new int[2][];

a[0]=new int[]{10,20};

a[1]=new int[]{100,110,120,130};

for (int i = 0; i < a.length; i++) {

for (int j = 0; j < a[i].length; j++) {

System.out.print(a[i][j]+" ");

}

System.out.println();

}

}

输出:

10 20

100 110 120 130

 

 

九、数组工具

(一)排序sort

Java API中有一个类 Arrays,定义大量的sort方法,可以对数组中元素进行升序排序;

public static void main(String[] args) {

int []arr = {3,2,1,5,4};

Arrays.sort(arr);

System.out.println(arr);

}

(二)查找

Java API中有一个类 Arrays,定义大量的binarySearch方法,可以对数组中元素进行查找;

二分查找法找指定元素的索引值(下标):binarySearch

数组一定是排好序的,否则会出错。找到元素,只会返回最后一个位置

 

public static void main(String[] args) {

int []arr = {10,20,30,40,50};

System.out.println(Arrays.binarySearch(arr, 20));

}

结果是:1

分析:能找到该元素,返回下标为1(0开始)

(三)拷贝

Java API中有一个类 System,定义大量的arraycopy方法,对数组中元素进行拷贝

arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
 从指定源数组中复制一个数组,复制从指定的位置开始,到目标数组的指定位置结束。

 int[] a={10,100,1000};

 int[] b={20,200,2000,20000};

 System.arraycopy(a, 1, b, 2, 2);

    for(int x:b){

         System.out.println(x);

    }

 

输出结果:20  200  100  1000

 

 

十、冒泡排序

冒泡排序主要的思想是进行相邻的两个元素之间比较并且交换,有利于利用原有元素在集合中的位置优
势,冒泡排序的原则是大的下沉小的上浮(跟最终的排序要求保持一致)

 

public static void sort(int[] arr)  {

    // 总共要经过 N-1 轮比较
    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]){
                exch(arr,j,j+1);
            }
        }
    }
}
private static void exch(int[] a, int j, int i) {
     int tmp=a[j];
     a[j]=a[i];
     a[i]=tmp;
}

 

十一、数组总结

1..数组的声明方式   

  1)类型[] 数组名=new 类型[长度]  

   2)类型[] 数组名=new 类型[]{用逗号隔开的数组元素}

    3)类型[] 数组名={用逗号隔开的数组元素}
2.数组的遍历方式

    1)for循环
        for(int i=0;i<a.length;i++){
           a[i]
        }
    2)for增强
        for(类型 临时变量:数组名){
            临时变量:数组的当前项
        }
    3)逆向遍历
        for(int i=a.length-1;i>=0;i--;){
          a[i]
        }
  3.数组常见异常
    1)数组索引越界异常 int[] a=new int[3];  a[3]
    2)空指针异常  int[] a=null;a[0]
  4.多维数组
    数组的元素是数组
    声明方式:
    数组元素类型[][] 变量名称=new 数组元素类型[一维长度] [二维长度];
    数组元素类型[][] 变量名称=new 数组元素类型[][]{{元素,元素,...},{元素,元素,...},...};
    数组元素类型[][] 变量名称={{元素,元素,...},{元素,元素,...},...};
5.访问指定位置的元素
   数组名称[行的索引][列的索引]
6.数组的长度
   数组名称.length 行数
   数组名称[索引].length 具体行的长度

7.二维数组的遍历     for (int i = 0; i < a.length; i++) {
    for (int j = 0; j < a[i].length; j++) {
    System.out.println(a[i][j]);
    }
    }
8.排序
    Arrays.sort()升序
9.查找
    int index = Arrays.binarySearch(a,50);
10.拷贝
    System.arraycopy(原数组,原数组的索引,目标数组,目标数组的索引,拷贝的长度);

 

posted @ 2022-04-20 22:08  MM&WW  阅读(138)  评论(0编辑  收藏  举报