Lison
<dreamlison@163.com>
, v1.0.0
, 2023.03.22
JAVA-编程基础-06-数组
什么是数组
数组是一种线性数据结构,是一个使用连续的内存空间存放相同的数据类型的集合容器,与其他容器相比,数组的区别主要在于性能与保存基本类型的能力。
在Java中,数组是一种效率最高的存储和随机访问对象的方式,通过寻址公式,随机访问的时间复杂可以达到O(1),但是为了保持空间的连续性,在数组中插入、删除数据时,都需要移动后面数据,该操作的时间复杂度为O(n)。另外,由于空间上连续,所以数组对CPU缓存比较友好,借助CPU的缓存机制,预读数组中的数据,提高访问效率。但是,由于数组是定长的,一旦声明之后就不可以改变长度,所以如果长度声明过大或者过小都会造成问题。
数组可以自动给数组中的元素从0开始编号,方便操作这些元素。数组属于引用变量,并且数组的长度是固定的,数组的使用有四个步骤,声明数组,分配空间,赋值,处理。
一维数组的声明与创建
元素类型[] 数组名 = new 元素类型[元素个数或数组长度];
元素类型[] 数组名 = new 元素类型[]{元素,元素,……};
元素类型[] 数组名 = {元素,元素,……};
示例:int[] arr = new int[5];
int[] arr = new int[]{3,5,1,7};
int[] arr = {3,5,1,7};
注意:给数组分配空间时,必须指定数组能够存储的元素个数来确定数组大小。创建数组之后不能修改数组的大小。可以使用length 属性获取数组的大小。
数组的初始化
int[] arr = new int[5];//创建数组第一种方式,此时默认值都是为0
arr[0] = 1;//数组的初始化
arr[1] = 2;//数组的初始化
int[] arr = new int[]{3,5,1,7};//第二种方式:创建并初始化数组
int[] arr = {3,5,1,7};//第三种方式:创建并初始化数组
int[] arr;
arr = {1,2,3,4,5};//这种方式是错误的
数组的常见异常
ArrayIndexOutOfBoundsException 索引值越界。
原因:访问了不存在的索引值:
public static void main(String[] args) {
int[] x = { 1, 2, 3 };
System.out.println(x[3]);//数组角标从0开始
}
NullPointerException 空指针异常:
原因: 引用类型变量没有指向任何对象,而访问了对象的属性或者是调用了对象的方法。
public static void main(String[] args) {
int[] x = { 1, 2, 3 };
x = null;
System.out.println(x[1]);
}
数组内存分析
Arrays的使用
给数组赋值:通过 fill 方法。
比较数组:通过 equals 方法比较数组中元素值是否相等。
排序: sort() 将数组按照升序排列
查找: binarySearch()在指定数组中查找指定元素,返回元素的索引,如果没有找到返回(-插入点-1) 注意:使用查找的功能的时候,数组一定要先排序。
序号 | 方法和说明 |
---|---|
binarySearch | public static int binarySearch(Object[] a, Object key) 用二分查找算法在给定数组中搜索给定值的对象(Byte,Int,double等)。数组在调用前必须排序好的。如果查找值包含在数组中,则返回搜索键的索引;否则返回 (-(插入点) - 1)。 |
equals | public static boolean equals(long[] a, long[] a2) 如果两个指定的 long 型数组彼此相等,则返回 true。如果两个数组包含相同数量的元素,并且两个数组中的所有相应元素对都是相等的,则认为这两个数组是相等的。换句话说,如果两个数组以相同顺序包含相同的元素,则两个数组是相等的。同样的方法适用于所有的其他基本数据类型(Byte,short,Int等)。 |
fill | public static void fill(int[] a, int val) 将指定的 int 值分配给指定 int 型数组指定范围中的每个元素。同样的方法适用于所有的其他基本数据类型(Byte,short,Int等)。 |
sort | public static void sort(Object[] a) 对指定对象数组根据其元素的自然顺序进行升序排列。同样的方法适用于所有的其他基本数据类型(Byte,short,Int等)。 |
public static void main(String[] args) {
int[] array = new int[]{10,30,50,40,60};
System.out.println(Arrays.toString(array));
Arrays.sort(array);
System.out.println(Arrays.toString(array));
System.out.println("最小值:"+array[0]+";最大值:"+array[array.length-1]);
int result = Arrays.binarySearch(array, 40);
System.out.println("目标值的角标:"+result);
}
二维数组
二维数组定义:数组类型[][] 数组名 = new 数组类型[一维数组的个数] [每一个一维数组中元素的个数];
public static void main(String[] args) {
int[][] a = new int[3][4];
System.out.println(a);//[[I@15db9742
System.out.println(a.length);//获取二维数组中存储的一维数组的个数3
System.out.println(a[0]);//获取的是二维数组中第一个一维数组:[I@6d06d69c
System.out.println(a[0].length);//第一个一维数组的长度:4
System.out.println(Arrays.toString(a[0]));//默认值都是0:[0, 0, 0, 0]
}
二维数组的初始化
//静态初始化:
int[][] b = new int[][]{{11,12,13,14},{21,22,23,24},{31,32,33,34}};
//动态初始化:
int[][] c = new int[3][4];
int value = 0;
for(int i = 0;i<c.length;i++){
for(int j = 0;j<c[i].length;j++){
c[i][j] = ++value;
}
}
数组-2
在java中有很多方式来存储一列数据,而且在操作上面比数组方便的多?但为什么我们还需要使用数组,而不是替代它呢?
数组与其他种类的容器之间的区别有三个方面呢:效率、类型和保存基本类型的能力。在Java中,数组是一种效率最高的存储和随机访问对象引用序列的方式。
数组确实是没有List、Set这些集合使用方便,但是在某些方面数组还是存在一些优势的,例如:速度,而且集合类的底层也都是通过数组来实现的。