java基础之数组

概述:

         数组,表示一块连续的内存空间,可用来存储多个数据(元素),要求元素类型要一致。

 数组的初步认识:

 1)如果有五个数据1 2 3 4 5,需要去接收、保存、操作这些数据,需要五个变
量接收。

int a1 = 1;
int a2 = 2;
int a3 = 3;
int a4 = 4;
int a5 = 5;
// int类型变量,用来标识1块内存,只能用来存放1个数值

2)现在有了数组,我们可以使用一个数组来存储这五个数据:

int[] arr = {1,2,3,4,5};
// 这里使用一个数组来保存这5个元素值
// 数组表示一块连续的内存空间,可以用来存放多个元素值

 3)我们对数组其实不陌生,之前课程已经接触过,大家可看下面代码:

//这个参数args的类型是字符串数组
public static void main(String[] args) {
// 注意:下面代码看不懂没有关系,本章学完能看懂即可
//控制循环输出的次数
int num = 1;
//如果main方法的参数args有接收到参数值的话
if(args.length > 0) {
    //把接收到的值转换为int类型,并赋值给变量num
    num = Integer.parseInt(args[0]);
}
    //循环输出hello,默认输出次数为1,如果用户给main方法传参了,则按照用户的要求的次数进行输出
for(int i = 0; i < num; i++) {
    System.out.println("hello");
    }
}

数组的定义 

 格式一:数据类型[] 数组名:(推荐用法)

 示例:

int[] arr;
double[] arr;
char[] arr;

 格式二:数据类型 数组名[]:

 示例:

int arr[];
double arr[];
char arr[];

内存构成:

java基础之数组_第1张图片

注意: 数组是引用数据类型,用来存储一个引用值(可理解为地址值)。且当数组没有进行初始化,不可以直接使用。

数组的初始化 :

 数组的初始化:定义数组的同时(开辟栈空间),给其附上初值

一、动态初始化 

 格式:

        数据类型[] 数组名 = new 数据类型[数组长度];

 例子:

int[] arr1 = new int[3];
double[] arr2 = new double[2];
String[] arr3 = new String[4];

值得注意的是:

         1.new是一个关键字,表示伪数组开辟新的内存空间。

         2.等号两边的数据类型要一致。

        3. 数组的长度一定要有,一般大于0(可以等于0,但很少使用),不能为负数。

二、内存构成 

 数组名标识的那块内存(栈空间),存放了一个引用值(地址值),通过该地址值可以找到堆空间相应内存(用来存放数组中所有元素)。堆空间内存存在默认初始化:整形数初始化为0,浮点数0.0,引用类型null,字符类型初始化 \u0000。

java基础之数组_第2张图片

三、 数组下标

 数组的下标的区间为 [0, 数组长度-1] 。如果数组长度为length,那么数组下标的最小值为0,下标最大值为length-1 。通过下标可以访问数组中元素:

//数组长度为4,那么其下标就是0~3
int[] arr = new int[4];
//可以通过下标获取数组元素值
System.out.println(arr[0]);
System.out.println(arr[3]);

通过数组下标给数组元素赋值:

int[] arr = new int[4];
arr[0] = 337;
arr[1] = 340;
arr[2] = 348;
arr[3] = 352;

利用循环语句给数组元素赋值:

int[] arr = new int[4];
//数组下标的取值范围,从0开始,到数组长度-1
for(int i = 0; i < 4; i++){
arr[i] = 10 + i;
}
//获取数组每个元素的值,并且输出
for(int i = 0; i < 4; i++){
System.out.println(arr[i]);
}
四、数组长度 

 数组长度,是指在一个数组中,可以存放同一类型元素的最大数量。

获取数组元素长度的固定格式:数组名.length

int[] arr = new int[4];
System.out.println(arr.length);

注意: 数组长度,必须在创建数组对象的时候就明确指定数组长度,一旦确定,就无法再改变
数组长度,可以>=0(一般大于0),但不能为负。

五、数组默认值 

 数组在创建时,会开辟2块内存,数组名对应栈空间那块内存,数组元素会存放在堆空间。
堆空间数组每一个元素位置上,存在相应的默认值,要么为0,要么为0.0,要么为null。

//byte、short、int、long类型数组中的默认值为 0
//例如
int[] a = new int[4];//默认4个数据全是0
//float、double类型数组中的默认值为 0.0
double[] d = new double[4];//默认4个数据全是0.0
//boolean类型数组中的默认值为 false
boolean[] d = new boolean[4];//默认4个数据全是false
//char类型数组中的默认值为 '\u0000'
char[] d = new char[4];//默认4个数据全是'\u0000'
//引用类型数组中的默认值为 null【不理解引用类型没关系,后续会补充】
String[] d = new String[4];//默认4个数据全是null
六、静态初始化 

静态初始化:在创建数组的同时,直接初始化数组元素的值 。

格式一:数据类型[] 数组名 = new 数据类型[]{元素1,元素2,...};

格式二:数据类型[] 数组名 = {元素1,元素2,...};(推荐)

错误示例:

//错误方式1:不能明确数组长度
int[] arr4 = new int[3]{1,2,3};
//错误方式2:简化版格式必须严格按照上述格式书写,不能分两行书写
int[] arr5;

数组异常 

        在使用数组的过程中,经常会遇到以下2种异常 : 

一、索引越界异常 
public static void main(String[] args) {
int[] arr = new int[4];
//数组下标最大取值为3,现在取4,超出了范围,会产生索引越界
异常
System.out.println(arr[4]);
}

结果:程序运行后,将会抛出 ArrayIndexOutOfBoundsException 数组越界异常。

原因和解决:数组下标最大取值为3,现在取4,超出了范围,会产生索引越界
异常。只需要将错误的索引修改为正确的索引范围即可!

注意:一旦出现数组越界异常,必须对代码进行修改。

二、空指针异常 
public static void main(String[] args) {
int[] arr = new int[3];
//把null赋值给数组
arr = null;
System.out.println(arr[0]);
}

arr = null 这行代码,意味着变量arr将不会在保存数组的内存地址,我们通过arr这个标识符再也找不到堆空间数组元素,因此运行的时候会抛出NullPointerException 空指针异常。 

解决方案:给数组一个真正的堆内存空间引用即可。

注意:在开发中,空指针异常是不能出现的,一旦出现了,就必须要修改代码。

工具类 

 java.util.Arrays 类,是JavaSE API中提供给我们使用的一个工具类,这个类中包含了操作数组的常用方法,比如排序、查询、复制、填充数据等,借助它我们在代码中操作数组会更方便。
Arrays中的常用方法:
        toString方法:可以把一个数组变为对应的String形式
        copyOf方法:可以把一个数组进行复制,该方法中也是采用了arraycopy方法来实现的功能
        sort方法:可以对数组进行排序
        binarySearch方法:在数组中,查找指定的值,返回这个指定的值在数组中的下标,但是查找之前需要在数组中先进行排序,可以使用sort方法先进行排序
        copyOfRange方法(了解):也是复制数组的方法,但是可以指定从哪一个下标位置开始复制,该方法中也是采用了arraycopy方法来实现的功能
        fill(了解):可以使用一个特定的值,把数组中的空间全都赋成这个值

二维数组 

 如果把普通的数组(一维数组),看作一个小盒子的话,盒子里面可以存放很多数据,那么二维数组就是像一个大点的盒子,里面可以存放很多小盒子(一维数组)。

定义格式 

二维数组固定定义格式有2种,具体如下:
        格式1:数据类型[][] 数组名 = new 数据类型[一维长度m][二维长度n];
                m:表示二维数组的元素数量,即可以存放多少个一维数组
                n:表示每一个一维数组,可以存放多少个元素
        格式2:数据类型[][] 数组名 = new 数据类型[一维长度][]

内存结构 

可以吧二维数组看成一个一维数组。数组的每个元素对应的内存区域中,存放的是一维数组引用值,具体如下图:java基础之数组_第3张图片 

java基础之数组_第4张图片 

二维数组访问方式和一维数组大致一样,大家参考下面二维数组求和案例即可: 

  public static void main(String[] args) {
    // 1. 定义求和变量,准备记录最终累加结果
        int sum = 0;
    // 2. 使用二维数组来存储数据
        int[][] arr = new int[3][];
        arr[0] = new int[]{10};
        arr[1] = new int[]{20, 20};
        arr[2] = new int[]{30, 30, 30};
    //思考,下面一行代码是否正确
        //arr[2] = {30,30,30};
        // 3. 遍历二维数组,获取所有元素,累加求和
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                sum += arr[i][j];
            }
        }
        // 4. 输出最终结果
        System.out.println(sum);
    }

 

 

 

 

你可能感兴趣的:(算法,java,数据结构)