数组

概述

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

 

      创建数组对象会在内存中开辟一整块连续的空间,而数组名中引用的是这块连续空间的首地址。

 

 数组的长度一旦确定,就不能修改

 我们可以直接通过下标(或索引)的方式调用指定位置的元素,速度很快。

 

数组的分类

 按照维度:一维数组、二维数组、三维数组、…

 按照元素的数据类型分:基本数据类型元素的数组、引用数据类型元素的数组(即对

象数组)

 

一维数组

1.1、声明

type var[] 或 type[] var;

 

例如:

         int a[];

         int[] a1;

         double b[];

         Mydate[] c;  //对象数组

 

Java语言中声明数组时不能指定其长度(数组中元素的数), 例如: int a[5];  //非法

 

注:等号左边叫声明

 

1.2、初始化

(1)动态初始化:数组声明且为数组元素分配空间 与 赋值的操作分开进行。

int[] arr = new int[3];

arr[0] = 3;

arr[1] = 9;

arr[2] = 8;

 

String[] names;

names = new String[4];

names[0] = "张扬";

names[1] = "杨睿";

names[2] = "司马旭升";

names[3] = "李彬";

 

MyDate dates[];

dates = new MyDate[3];

dates[0] = new MyDate(22, 7, 1964);

dates[1] = new MyDate(1, 1, 2000);

dates[2] = new MyDate(22, 12, 1964);

 

int scores[];

scores = new int[]{60,70,80,90,100};        //分配空间和赋值在一起

(这是什么初始化?)

 

(2)静态初始化:在定义数组的同时就为数组元素分配空间并赋值。

int a[] = new int[]{ 3, 9, 8};

int[] a = {3,9,8};

 

MyDate dates[] = {

        new MyDate(22, 7, 1964),

        new MyDate(1, 1, 2000),

        new MyDate(22, 12, 1964)

}

 

 

1.3、错误的初始化

静态初始化时,指定数组长度

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

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

 

int[] arr2;

arr2 = {1,2,3};

 

正确:

int[] arr1 = new int[]{1,2,4};

int[] arr2;

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

 

注:红色字体为错误部分

 

1.4、正确的初始化

int[] a;

a = new int[3];

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

     

int aa[];

aa = new int[3];

aa = new int[]{1,2,3};

     

int aaa[] = {1,2,3};

int[] aaaa = {1,2,3};

     

int aaaaa[] = new int[] {1,2,3};

int[] aaaaaa = new int[] {1,2,3};

     

 

1.5、一维数组的默认初始值

数组是引用类型,它的元素相当于类的成员变量,因此数组一经分配空间,其中的每个元素也被按照成员变量同样的方式被隐式初始化。例如:

 

public class Test {

public static void main(String argv[]){

int a[]= new int[5];

System.out.println(a[3]); //a[3]的默认值为0

}

}

对于基本数据类型而言,默认初始化值各有不同

对于引用数据类型而言,默认初始化值为null(注意 与0 的不同)

 

不同类型的数组元素的默认初始化值

整型数组:byte、short、int、long的默认数组元素的初始化值都为0

浮点型数组:float、double 的默认数组元素的初始化值都为0.0

字符型数组:char的默认数组元素的初始化值都为 '\u0000' 或 0  (不要理解为:'0')

布尔型数组:boolean的默认数组元素的初始化值都为false

引用数据类型数组:数组、接口、类的默认数组元素的初始化值为null

 

 

1.6、数组元素的引用

定义并用运算符new为之分配空间后,才可以引用数组中的每个元素;

数组元素的引用方式:数组名[数组元素下标]

数组元素下标可以是整型常量或整型表达式。如a[3],b[i],c[6*i];

数组元素下标从0开始;长度为n的数组合法下标取值范围:0 —> n-1;

如int a[]=new int[3]; 可引用的数组元素为a[0]、a[1]、a[2]

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

数组一旦初始化,其长度是不可变的。

 

 

 

二维数组

对于二维数组的理解,我们可以看成是一维数组array1又作为另一个一维数组array2的元素而存在。其实,从数组底层的运行机制来看,其实没有多维数组。

 

2.1、动态初始化

格式一:int[][] arr = new int[3][2];

定义了名称为arr的二维数组

二维数组中有3个一维数组

每一个一维数组中有2个元素

一维数组的名称分别为arr[0], arr[1], arr[2]

给第一个一维数组1脚标位赋值为78写法是:arr[0][1] = 78;

 

格式二:int[][] arr = new int[3][];

二维数组中有3个一维数组。

每个一维数组都是默认初始化值null(注意:区别于格式1)

可以对这个三个一维数组分别进行初始化

arr[0] = new int[3];

arr[1] = new int[1];

arr[2] = new int[2];

注:int[][]arr = new int[][3];  //非法

 

2.2、静态初始化

int[][] arr = new int[][]{{3,8,2},{2,7},{9,0,1,6}};

定义一个名称为arr的二维数组,二维数组中有三个一维数组

每一个一维数组中具体元素也都已初始化

第一个一维数组 arr[0] = {3,8,2};

第二个一维数组 arr[1] = {2,7};

第三个一维数组 arr[2] = {9,0,1,6};

第三个一维数组的长度表示方式:arr[2].length;

 

注意:

特殊写法情况:int[] x,y[]; x是一维数组,y是二维数组。

Java中多维数组不必都是规则矩阵形式。

 

定义:

一维数组:int[] x 或者 int x[]  

二维数组:int[][] y 或者 int[] y[] 或者 int y[][]

 

练习:

声明:int[] x,y[];以下选项允许通过编译的是

(1)x[0] = y;

(2)y[0] = x;

(3)y[0][0] = x;

(4)x[0][0] = y;

(5)y[0][0] = x[0];

(6)x = y;

 

注:int[] x,y[]; 相当于 int[] x; int[] y[]; x是一维数组,y是二维数组

 

 

2.3、二维数组元素的值

如果调用的是二维数组元素a,而元素a仍然是数组,根据元素a的数组元素的类型,决定其内部元素的默认初始化值。与一维数组的规定相同。

如果输出元素a,其值决定于是否初始化过。如果初始化过,则输出其地址值。如果没有初始化过,则值为null。

 

例子:

int[][] arr3 = new int[3][];

System.out.println(arr3[1]);//null

 

只初始化了第一维数组,二维没有初始化,所以arr3[1]是第二个一维数组的地址,因为二维没有初始化,所以为null

 

直接打印数组,结果是数组指针的地址值

int[] array1,array2;

array1 = new int[]{2,3,5,7,11,13,17,19};

System.out.print(array1);

 

控制台:

[I@7852e922

 

2.4、错误的初始化

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

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

 

2.5、赋值操作

错误的赋值操作:

      int[][] nums = new int[3][];

      nums[0] = new int[3];

      nums[0][2] = 5;

      nums[1][2] = 5;   

                   //这一行会报空指针错误,数组(一维)位置1上的数组(二维)没有分配空间

 

 

正确的赋值操作:

      String[][] names = new String[3][2];  //一维和二维都分配空间了

      names[1][0] = "songzz";

 

      int[][] scores2 = new int[3][];

      scores2[0] = new int[]{6,7,8};

      scores2[0][0] = 9;

      scores2[1] = new int[]{6};

 

      int[][] x = new int[3][];

      x[0] = new int[3];

      x[1] = new int[2];

      x[2] = new int[4];

      x[1][0] = 12;

 

常用算法

1、 杨辉三角

2、 求数值型数组中元素的最大值、最小值、平均数、总和等

3、 数组的复制、反转、查找(线性查找、二分法查找)

4、数组元素的排序算法

 

Arrays工具类

java.util.Arrays类即为操作数组的工具类,包含了操作数组(排序和搜索)的各种方法。

 

boolean equals(int[] a,int[] b) 判断两个数组是否相等。

String toString(int[] a) 输出数组信息。

void fill(int[] a,int val) 将指定值填充到数组之中。

void sort(int[] a) 对数组进行排序。

int binarySearch(int[] a,int key) 对排序后的数组进行二分法检索指定的值。

 

 

数组中常见的异常

1、数组角标越界的异常:ArrayIndexOutOfBoundsExcetion

2、空指针异常:NullPointerException

 

posted @ 2020-02-26 16:59  智阿广  阅读(177)  评论(0)    收藏  举报