一、什么是数组

是一种最简单的复合数据类型,它是有序数据的集合,数组中的每个元素具有相同的数据类型,可以用一个统一的数组名和不同的下标来确定数组中唯一的元素。根据数组的维度,可以将其分为一维数组、二维数组和多维数组等。

二、数组的三大特性

一致性:数组只能保存相同数据类型元素,元素的数据类型可以是任何相同的数据类型。

有序性:数组中的元素是有序的,通过下标访问

不可变性:数组一旦初始化,则长度(数组中元素的个数)不可变。

三、数组具有的特点

1、数组可以是一维数组、二维数组或多维数组

2、数值数组元素的默认值为 0,而引用元素的默认值为 null。

3、数组的索引从 0 开始,如果数组有 n 个元素,那么数组的索引是从 0 到(n-1)

4、数组元素可以是任何类型,包括数组类型。

5、数组类型是从抽象基类 Array 派生的引用类型

6、声明一维数组,推荐 数据类型[] 数组名 格式

四、数组在内存中的存储过程

分为两种情况

1、基本类型数组

第一步:声明数组int[] array

仅在栈内存中定义了一个空引用(就是array数组变量),这个引用并未指向任何有效的内存,故在初始化时无法指定数组的长度,

java数组属性 java数组的特性_数据结构

第二步:分配内存空间array= new int[2]

为array数组分配内存空间,并分配默认的初始值:所有数值类型数组元素默认赋值为0,

java数组属性 java数组的特性_数据结构_02


第三步:初始化数组

array[0] = 1;
array[1] = 2;
array[2] = 3;

java数组属性 java数组的特性_java_03

2、引用类型数组

引用类型数组的数组元素是引用类型,所以每个数组元素存储的是引用信息,指向另一块内存。

第一步:声明引用数组User[] array

java数组属性 java数组的特性_数据结构

第二步:分配内存空间array= new User[3]

java数组属性 java数组的特性_数据结构_05


第三步:初始化数组

User[] array;
array = new User[3];

User user1 = new User();
user1.setName("张三"); 

User user2 = new User();
user2.setName("李四"); 

User user3 = new User();
user3.setName("王五");

java数组属性 java数组的特性_java_06

array[0] = user1;
array[1] = user2;
array[2] = user3;

java数组属性 java数组的特性_java_07

五、数组的创建及初始化

1、声明数组

int[] array;   
double[] array;    
String[] array;

PS:在声明数组时不需要规定数组的长度

int array[10];    // 这是错误的

2、分配内存空间

声明了数组,只是得到了一个存放数组的变量,并没有为数组元素分配内存空间,不能使用

array= new int[10];
array= new double[20];
array= new String[30];
#声明数组时就给它分配空间
int[] array= new int[5];

PS:一旦声明了数组的大小,就不能再修改。

3、初始化数组

数组必须先初始化,然后才可以使用。所谓初始化,就是为数组的数组元素分配内存空间,并为每个数组元素赋初始值

int[] array= new int[3];
array[0] = 1;
array[1] = 2;
array[2] = 3;

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

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

六、数组常见的异常错误

NullPointerException

int array[] = {1,4,2,9} ;
array = null;
System.out.println(array[0]);

数组没有引用到一个数组的实例,换句话说数组引用的值为NULL时,会产生该异常

ArrayIndexOutOfBoundsException

int array[] = {1,4,2,9} ;
System.out.println(array[4]);

数组索引值指定错误或起始位置给定错误,也可能是所访问数据的个数超出数组的大小范围时引发的异常

ArrayStroeException

Object array[ ] = new String[1]; 
array[0] = new Integer(0);

将错误类型的对象存储到一个对象数组时抛出的异常。

七、数组Arrays工具类

Arrays 类是一个工具类,其中包含了数组操作的很多方法。这个 Arrays 类里均为 static 修饰的方法(static 修饰的方法可以直接通过类名调用),可以直接通过 Arrays.xxx(xxx) 的形式调用方法。

1、int binarySearch(type[] a, type key)

使用二分法查询 key 元素值在 a 数组中出现的索引,如果 a 数组不包含 key 元素值,则返回负数。调用该方法时要求数组中元素己经按升序排列,这样才能得到正确结果。

2、int binarySearch(type[] a, int fromIndex, int toIndex, type key)

这个方法与前一个方法类似,但它只搜索 a 数组中 fromIndex 到 toIndex 索引的元素。调用该方法时要求数组中元素己经按升序排列,这样才能得到正确结果。

3、type[] copyOf(type[] original, int length)

这个方法将会把 original 数组复制成一个新数组,其中 length 是新数组的长度。如果 length 小于 original 数组的长度,则新数组就是原数组的前面 length 个元素,如果 length 大于 original 数组的长度,则新数组的前面元索就是原数组的所有元素,后面补充 0(数值类型)、false(布尔类型)或者 null(引用类型)。

4、type[] copyOfRange(type[] original, int from, int to)

这个方法与前面方法相似,但这个方法只复制 original 数组的 from 索引到 to 索引的元素。

5、boolean equals(type[] a, type[] a2)

如果 a 数组和 a2 数组的长度相等,而且 a 数组和 a2 数组的数组元素也一一相同,该方法将返回 true。

6、void fill(type[] a, type val)

该方法将会把 a 数组的所有元素都赋值为 val。

7、void fill(type[] a, int fromIndex, int toIndex, type val)

该方法与前一个方法的作用相同,区别只是该方法仅仅将 a 数组的 fromIndex 到 toIndex 索引的数组元素赋值为 val。

8、void sort(type[] a)

该方法对 a 数组的数组元素进行排序。

9、void sort(type[] a, int fromIndex, int toIndex)

该方法与前一个方法相似,区别是该方法仅仅对 fromIndex 到 toIndex 索引的元素进行排序。

10、String toString(type[] a)

该方法将一个数组转换成一个字符串。该方法按顺序把多个数组元素连缀在一起,多个数组元素使用英文逗号,和空格隔开。