1、数组的概述
数组(Array):是多个相同类型数据按一定顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行统一管理。
数组的相关概念:
数组名:数组的名称
元素:相同类型的具体数据
角标、下标、索引
数组的长度:元素的个数
数组的特点:
(1)、数组属于引用类型的变量,里面的每个元素可以是任何数据类型,包括基本数据类型和引用数据类型。
(2)、创建数组对象会在内存中开辟一块连续的空间进行存储,数组名中的引用的是这块连续空间的首地址。
(3)、数组的长度一旦确定,就无法再更改。
(4)、我们能够通过下标的方式直接查找到指定位置的元素,速度很快。
数组的分类:
(1)按照数组的维数:一维数组、二维数组……
(2)按照数组元素的类型:基本数据类型元素的数组、引用数据类型元素的数组。
2、一维数组的使用
(1)数组声明和初始化方法:
声明:类型 类型名称; 如int num;
初始化:类型名称赋值;如 num = 1;
声明并初始化:同时进行类型的声明和初始化; 如 int num = 1;
数组的声明方式:type[] var 或 type var[] (type:数组元素类型 var:元素名称)
数组的初始化:
a、静态初始化:var = new int[] {100, 200, 300, 400}; 数组的初始化和数组元素的赋值操 作同时进行。
b、动态初始化:var = new int[5];数组的初始化和数组元素的赋值操作分开进行。
总结:不管是静态初始化还是动态初始化,数组一旦初始化完成,其长度就确定了。
(2)数组的引用:
数组引用的前提条件:声明并运用运算符new为之分配空间后,才可以引用数组中的元素。
数组的引用方式:数组名[数组元素下标] (数组元素的下标可以是整型常量也可以是整型表达式)
数组元素下标的范围:从0开始,到数组的长度-1为止
(3)获取数组的长度:
每个数组都有一个属性length指明其长度,即数组名.length为该数组的长度(元素个数)。
(4)遍历数组元素:
通过for或while循环,并定义一个变量从0不断自增到数组长度减一,然后输出即可。
(5)数组元素的默认初始化值:
(6)数组的内存解析:
栈(stack):线性数据结构,主要存放局部变量。
堆(heap):主要存放new出来的结构:对象和数组
方法区:常量池、静态域以及类加载信息。
一维数组的内存解析:
静态初始化:int[] arr = new int[]{1,2,3};先在栈空间中加入一个局部变量arr,然后在堆中创建一段连续的int类型的结构,并且初始值为0,然后根据静态初始化中的值对各个元素进行赋值,最后将该连续结构的首地址(十六进制)赋值给arr,将两者通过首地址联系起来。
当我们要去查询数组中某一个元素的时候,其是根据索引的下标和该数组的首地址算出其相对 地址进行查找到我们所需要的元素的地址的,从而找出对应的元素内容。还记得我们之前有提 到Java的自动回收功能,当我们某个局部变量结束以后,其会自动出栈,即被收回了,那么此 时其指向的堆中的对象就没有人再指向他,那么之后系统会根据这样判断,然后也将其回收掉。
动态初始化和静态初始化是一样的,只不过不是在初始化的时候赋值,而是根据用户在之后需要赋值的时候进行赋值。
这就是引用类型数据的特点,将对象的首地址存放在栈中,对象实际内容存放在堆中,通过栈中的对象的首地址指向该对象的内容,起到一个引用的特点。
3、多维数组的使用
由于数组中元素的类型可以是引用类型的数组,因此二维数组其实就可以看成是一维数组arr1又作为另一个一维数组arr2的元素的数组(多维同理)。从数组的底层的运行机制来看,其实没有多维数组。
(1)二维数组的声明和初始化:
静态初始化:type[][] var = new type[][]{{1,2,3},{2,4},{5,6}};
动态初始化:type[][] var = new type[3][2]或type[][] var = new type[3][];
(2)数组的引用:var[x][y]; 第x行的第y列的元素
(3)获取数组的长度:
var.length:var二维数组的行个数
var[x].length:var二维数组第x行的列个数
(4)二维数组元素的默认初始化值:
二维数组分为外层数组元素(arr[x])和内层数组元素(arr[x][y]),对于外层数组元素的初始值是其内层数组元素首地址值,对于内层数组元素的初始值同一维原理。
(5)二维数组的内存解析:
4、数组中涉及到的常见算法
略
5、Arrays工具类的使用
一般类名+s表示其工具类,可以在API文档中进行查询。
Java.util.Arrays:操作数组的工具类,里面定义了很多操作数组的方法。
比如说我们要对一个数组进行排序,即Arrays.sort(要排序的数组名称);
6、数组使用中的常见异常
(1)数组角标越界的异常:ArrayIndexOutOfBooundsExcetion
即出现引用数组时的下标超除了数组的长度大小范围。
(2)空指针异常:NullPointerException
情况1:数组未赋值,为null的情况。
int[] arr = new int[]{1,2,3};
arr = null;
输出arr[0]报错,空指针问题。此时的arr值为null,即没有指向堆中的数据,我们去arr 中找第一个元素肯定就错了。
情况2:
int[][] arr = new int[4][];
输出arr[0][0],空指针问题。
情况3:
String[] arr = new String[]{“AA”,“BB”,“CC”};
arr[3] = null;
输出arr[3].tostring();空指针问题。
总结:当对null进行操作时,会发生空指针的问题。即对一个没有指向任何数据的东西进行操作。