【Java基础】数组定义、初始化、访问、内存排列

0.数组概述

  • 数组是多个相同类型数据的组合,实现对这些数据的统一管理

  • 数组属引用类型,数组型数据是对象(object),数组中的每个元素相当于该对象的成员变量

  • 数组中的元素可以是任何数据类型,包括基本类型和引用类型

1.一维数组

1.1一维数组声明创建对象

1.1.1声明方式

type var[] 或 type[] var

例如

 int a[];
 int[] a1;
 double b[];
 double[] c;
  • 在java中声明数组不能指定其长度,例如 int a[5] 是违法的

1.1.2 创建一维数组(定义及初始化)

①创建但不赋初值

int a[] = new int[5];//每个元素默认值为0
//错误示范
int a[3];
int a[3] = new int[];
int a[3] = new int[3];

②静态创建并初始化

int a[] = {1,2,3,4,5};
//等价于
a[0]=1;a[1]=2;a[2]=3;a[3]=4;a[4]=5;

③使用初始化列表动态创建并初始化

int a[] = new int[]{1,2,3,4,5};//等同于静态初始化
//错误示例
int a[] = new int[5]{1,2,3,4,5};

④指向已有数组

int a[] = new int[]{1,2,3,4,5};
int e[] = a;//指向已有数组对象
//错误示例
int a[];
int e[] = a;//指向未初始化引用

1.2一维数组内存排列

在这里插入图片描述
在这里插入图片描述

1.3 一维数组元素的引用

数组元素的引用方式: arrayName[index]
index为数组元素 下标
数组元素下标从0开始;
长度为n的数组合法下标取值范围:0 ~ n-1;

每个数组都有一个属性length指明它的长度,例如:
a.length指明数组a的长度(元素个数)。

  • 访问单个元素
int a[] = new int[]{1,2,3,4,5};
a[0]=6;
a[1]=7;
a[3]=5;
  • 遍历所有元素
for(int i=0;i<a.length;i++){
    a[i] = xxx;
}

例子

1.定义一一个10个元素的数组a[10],要求手动从控制台输入每个元素的值,然后将每个元素的值统一 打印出来。

import java.util.Scanner;

public class Main{
    public static void main(String[] args){
//        定义一一个10个元素的数组a[10],要求手动从控制台输入每个元素的值,然后将每个元素的值统一 打印出来。
        int[] a = new int[10];
        Scanner sc = new Scanner(System.in);
        for(int i=0;i<a.length;i++){
            System.out.println("请输入a["+i+"]的值:");
            a[i] = sc.nextInt();
        }
        System.out.println("输入完毕");
        System.out.println("数组a的元素为");
        for(int j = 0;j<a.length;j++){
            System.out.print(a[j]+" ");
        }
    }
}

2.在上题的基础上,将程序修改为:分两批对数组进行赋值,第一次只赋值下标为0、2、4、6等偶数元素,第二次只赋值下标为1、3、5、7等奇数元素。然后分别打印出来,如:
下标为偶数的数组元素值为:
下标为0的元素值为XX。
下标为2的元素值为XX。
下标为4的元素值为XX。

下标为奇数的数组元素值为:
下标为1的元素值为XX。
下标为3的元素值为XX。
下标为5的元素值为XX。
提示:方法一、可以用for语句直接进行赋值(考虑下标一次增加多少? )。方法二、也可以用取模运算符“%”,判断哪些是偶数下标、哪些是奇数下标。

import java.util.Scanner;

public class Main{
    public static void main(String[] args){
//        定义一一个10个元素的数组a[10],要求手动从控制台输入每个元素的值,然后将每个元素的值统一 打印出来。
        int[] a = new int[10];
        Scanner sc = new Scanner(System.in);
        for(int i=0;i<a.length;i+=2){
            System.out.println("请输入a["+i+"]的值:");
            a[i] = sc.nextInt();
        }
        for(int i=1;i<a.length;i+=2){
            System.out.println("请输入a["+i+"]的值:");
            a[i] = sc.nextInt();
        }
        System.out.println("输入完毕");
        System.out.println("数组a的元素为");
        for(int j = 0;j<a.length;j+=2){
            System.out.println("下标为"+j+"的元组值为"+a[j]);
        }
        for(int i=1;i<a.length;i+=2){
            System.out.println("下标为"+i+"的元组值为"+a[i]);
        }
    }
}

2.二维数组

2.1定义及初始化

2.2.1 定义

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

跟一维数组类似,定义二维数组时,不能指定其第1维度(低维)的长度,但必须指定第2维( 高维)的长度:
对于java的二维数组,意为:‘“一维数组对象组成的数组,叫
做二维数组." 换句话说,就是二维数组中的每一个元素,是一个一维数组对象。
在这里插入图片描述

2.1.2 初始化

①创建但不赋值

int a[][] = new int[3][];//每个元素的值默认null;
//一下为错误示范
int a[3][] = new int[3][];//引用本身不能指定长度
int a[][] = new int[][];//必须指定第二维长度
int a[][] = new int[3][4];//低维指定长度不报错,但无意义

②静态创建并初始化

int a[][] = {{1,2,3},{4,5,6},{7,8,9}};
//等价于对高维每个元素分别赋值:
int a[][] = new int[3][];
a[0] = new int[]{1,2,3};
a[1] = new int[]{4,5,6};
a[2] = new int[]{7,8,9};

③使用初始化列表动态创建并初始化

int a[][] = new int[][]{new int[5],new int[5],new int[5]};

④指向已有数组

int a[][] = new int[3][];
int b[][] = a;//指向已有数组对象

⑤不定长二维数组

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

在java中, 由于二维数组实际上是“一维数组对象组成的数组。"本质上其还是一个一维数组(只是它里面的每个元素也是一维数组),因此它内部只要是一维数组对象即可(并不一定非得长度相等)

2.2二维数组的引用

  • 假设定义二维数组为:
int a[][] = new int[][]{new int[5],new int[5],new int[5}
//逻辑上的维度为3行5列(c语言中为int a[3][5])
  • 访问单个元素
a[0][1]=30;a[1][2]=80;a[2][4]=62;
  • 遍历所有元素
for(int i=0;i<a.length;i++)
    for(int j=0;j<a[i].length;j++)
        a[i][j]=xxx;

2.3二维数组内存布局(与c语言中的不同)

c语言中的二维数组
实际上是由同长度的一维数组拼接而成的:内存是连续分布的
在这里插入图片描述
java中的二维数组
而java中的二维数组,其本身本质上是一一个一维数组,内存连续;但由于其每个元素本身是一个一维数组对象的引用(长度可以不相等)。因此其内存是由一段一段的一维数组“链接”而成。逻辑上是一个整体,但物理上并不连续:

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

在这里插入图片描述

例子
1.设计一个N行N列的二维数组,将每个数组元素的值从N2
到1进行赋值,如a[0][0]= N^2, a[0][1]= N^2- 1,…a[N-1][N-1]=1。 并将结果打印出来。

import java.util.Scanner;

public class Main{
    public static void main(String[] args){
//        1.设计一个N行N列的二维数组,将每个数组元素的值从N2
//        到1进行赋值,如`a[0][0]= N^2`, `a[0][1]= N^2- 1`,...`a[N-1][N-1]=1`。 并将结果打印出来。
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入你想创建的正方形二维数组的行数:");
        int n = sc.nextInt();
        int[][] a = new int[n][];
//        注意记得初始化
        for(int i=0;i<n;i++){
            a[i] = new int[n];
        }
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                a[i][j] = i*n+j;
            }
        }
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                System.out.print(a[i][j]+" ");
            }
            System.out.println();
        }
    }
}

2.求二维数组(3行3列)的对角线元素的和
10,12,13
14,15,16
17,18,19

public class Main{
    public static void main(String[] args){
// 2.求二维数组(3行3列)的对角线元素的和
//10,12,13
//14,15,16
//17,18,19
        int sum=0;
        int[][] a = new int[][]{{10,12,13},{14,15,16},{17,18,19}};
        for(int i=0;i<a.length;i++){
            for(int j=0;j<a[i].length;j++){
                if(i==j){
                    sum+=a[i][j];
                }
            }
        }
        System.out.println("对角线和为:"+sum);
    }
}

3.求二维数组(3行3列)的顶部元素的和
4.求二维数组(3行3列)的左部元素的和
5.求二维数组(3行3列)的外部元素的和
在这里插入图片描述

public class Main{
    public static void main(String[] args){
// 2.求二维数组(3行3列)的对角线元素的和
//10,12,13
//14,15,16
//17,18,19
//        3.求二维数组(3行3列)的顶部元素的和
//        4.求二维数组(3行3列)的左部元素的和
//        5.求二维数组(3行3列)的外部元素的和
        int sum=0;
        int[][] a = new int[][]{{10,12,13},{14,15,16},{17,18,19}};
        for(int i=0;i<a.length;i++){
            for(int j=0;j<a[i].length;j++){
                if(i==j){
                    sum+=a[i][j];
                }
            }
        }
        System.out.println("对角线和为:"+sum);
        System.out.println("上边和:"+sumup(a));
        System.out.println("左边和:"+sumdown(a));
        System.out.println("边上一圈和:"+sumout(a));

    }
    // 上边和
    static int sumup(int[][] a){
        int sumup1=0;
        for(int i=0;i<a[0].length;i++){
            sumup1+=a[0][i];
        }
        return sumup1;
    }

//左边和
    static int sumdown(int[][] a){
        int sumdown1=0;
        for(int i =0;i<a.length;i++){
            sumdown1+=a[i][0];
        }
        return sumdown1;
    }

//边上一圈和
    static int sumout(int[][] a){
        int sumout1=0;
        for(int i=0;i<a.length;i++){
            for(int j=0;j<a[0].length;j++){
                if(i==0|j==0|i==a.length-1|j==a[0].length-1){
                    sumout1+=a[i][j];
                }
            }
        }
        return sumout1;
    }
}

6.求二维数组(5行5列)中最大元素值及其行列号。
7.将二维数组(5行5列)的右上半部分置零。
在这里插入图片描述

public class Main{
    public static void main(String[] args){
// 6.求二维数组(5行5列)中最大元素值及其行列号。
// 7.将二维数组(5行5列)的右上半部分置零。
        int[][] a = new int[][]{{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15},{16,17,18,19,20},{21,22,23,24,25}};
        int temp = a[0][0];
        int line=0,row=0;
        for(int i=0;i<a.length;i++){
            for(int j=0;j<a[0].length;j++){
                if (temp<a[i][j]){
                    temp = a[i][j];
                    line = i+1;
                    row = j+1;
                }
            }
        }
        System.out.println("最大的元素是第"+line+"行第"+row+"列元素:"+temp);


        //上半部分置零
        for(int i=0;i<a.length;i++){
            for(int j=i+1;j<a[0].length;j++){
                a[i][j]=0;
            }
        }
        for(int i=0;i<a.length;i++){
            for(int j=0;j<a[0].length;j++) {
                System.out.print(a[i][j]+" ");

            }
            System.out.println();
        }
        

    }
}

总结:

Exception in thread "main" java.lang.NullPointerException

上面这个错误是未进行初始化。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值