一、什么是数组
是一种最简单的复合数据类型,它是有序数据的集合,数组中的每个元素具有相同的数据类型,可以用一个统一的数组名和不同的下标来确定数组中唯一的元素。根据数组的维度,可以将其分为一维数组、二维数组和多维数组等。
二、数组的三大特性
一致性:数组只能保存相同数据类型元素,元素的数据类型可以是任何相同的数据类型。
有序性:数组中的元素是有序的,通过下标访问
不可变性:数组一旦初始化,则长度(数组中元素的个数)不可变。
三、数组具有的特点
1、数组可以是一维数组、二维数组或多维数组
2、数值数组元素的默认值为 0,而引用元素的默认值为 null。
3、数组的索引从 0 开始,如果数组有 n 个元素,那么数组的索引是从 0 到(n-1)
4、数组元素可以是任何类型,包括数组类型。
5、数组类型是从抽象基类 Array 派生的引用类型
6、声明一维数组,推荐 数据类型[] 数组名
格式
四、数组在内存中的存储过程
分为两种情况
1、基本类型数组
第一步:声明数组int[] array
仅在栈内存中定义了一个空引用(就是array数组变量),这个引用并未指向任何有效的内存,故在初始化时无法指定数组的长度,
第二步:分配内存空间array= new int[2]
为array数组分配内存空间,并分配默认的初始值:所有数值类型数组元素默认赋值为0,
第三步:初始化数组
array[0] = 1;
array[1] = 2;
array[2] = 3;
2、引用类型数组
引用类型数组的数组元素是引用类型,所以每个数组元素存储的是引用信息,指向另一块内存。
第一步:声明引用数组User[] array
第二步:分配内存空间array= new User[3]
第三步:初始化数组
User[] array;
array = new User[3];
User user1 = new User();
user1.setName("张三");
User user2 = new User();
user2.setName("李四");
User user3 = new User();
user3.setName("王五");
array[0] = user1;
array[1] = user2;
array[2] = user3;
五、数组的创建及初始化
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)
该方法将一个数组转换成一个字符串。该方法按顺序把多个数组元素连缀在一起,多个数组元素使用英文逗号,和空格隔开。