1 定义
2 初始化
3 下标访问
4 常见操作
4.1 sort(排序操作)
4.2 binarySearch(二分查找)
4.3 equals(判断两个数组是否相等)
4.4 fill
4.5 copyOf(复制数组)
4.6 toString(相当于遍历,得到数组的字符串表示)
4.7 arraycopy
5 数组应用
5.1 实现数组的遍历
5.2 实现数组元素的交换
5.3 实现两个数组之间的交换
6 使用数组过程中常见的两个异常
6.1 下标越界异常(ArrayIndexOutOfBoundsException)
6.2 空指针异常(NullPointerException)
7 特殊事项
数组是一组具有相同类型的元素的集合。
int[] a;
表示定义一个a,类型是存在int类型元素的数组,大小不确定。
int[] a = {1,2,3,4,5};
表示定义一个变量a,其类型是数组,该数组的元素类型是int,该数 组进行了初始化操作,数组大小确定为五个,元素分别是1,2,3,4,5.
int[] a =new int [] {1,2,3,4,5};
boolean[] a = {true,false};
String[] a = {"Hello ","World"};
String[] a = new String[] {"A","B"};
Random[] a = { new Random(),new Random(),new Random()};
int[] a = new int[3];
定义一个数组,元素个数为三;该式等价于 int[] a = new int[] {0,0,0}
String[] a = new String[3];
该式等价于 String[] a = new String[] {null,null,null};
注意:int[] a; a = {1,2,3,4,5}; 这种用法是错误的,不能使用这个语法
int[] a; a = new int[] {1,2,3}; 而这种语法是正确的
注意:数组的长度一旦确定是无法更改的。
int[] a = new int[3]; //定义一个有三个元素的数组,让a引用指向该数组
a = new int[5]; //定义一个新的有五个元素的数组,让a引用指向新的数组
上面这种写法是可以的,本质上数组长度没有变,只是改变了a的引用指向。
int[] a = {1,2,3};
int[] b = new int[]{1,2,3,4};
b = new int[]{4,5};
int[] c = new int[5];
int[] c = new int[3]; //改变c的指向,并不意味着改变了数组的长度
- 数组下标的类型为int类型,其下标范围为[0,数组的长度)。
- 使用下标访问数组元素的具体代码:
a[下标] = 0; //将该位置的元素赋值为0;
b = a[下标]; //将该位置的元素赋值给另一个变量
4.1.1 Java实现
Arrays.sort(array);//实现对数组的全排操作
Arrays.sort(array,1,5);//将数组下标为一到4的元素进行排序,其余位置不变
4.1.2 自实现
public static void MySort(long[] array,int fromIndex,int toIndex){
int size = toIndex - fromIndex;
for(int i = 0;i < size - 1;i++){
for(int j = fromIndex;j < toIndex - i - 1;j++){
if(array[j] > array[j + 1]){
swap(array,j,j+1);
}
}
// for(int j = 0;j < size - i - 1;j++){
// if(array[fromIndex + j] > array[fromIndex + j + 1]){
// swap(array,fromIndex + j,fromIndex + j + 1);
// }
// }
}
}
public static void swap(long[] array,int x,int y){
long t = array[x];
array[x] = array[y];
array[y] = t;
}
public static void Sort(long[] array){
//使用冒泡排序法
//外层循环代表一次冒泡
for(int i = 0;i < array.length - 1;i++){
//内层循环代表一次完整的冒泡过程
//array.length - 1 次冒泡过程
//无序区间为[0,len -i)
for(int j = 0;j < array.length - i - 1;j++){
if(array[j] > array[j+1]){
swap(array,j,j+1);
}
}
}
}
4.2.1 Java实现
long[] array = {1,2,3,4,6,8,10};
long r = Arrays.binarySearch(array,6);
//经过查找,可以返回该数所在的下标;如果数组中没有这个数,返回一个负值,代表没找到
4.2.2 自实现
public static int MyBinarySearch(long[] array,long key){
//待查找区间为左闭右闭
int fromIndex = 0;
int toIndex = array.length - 1;
while(toIndex >= fromIndex){
int midIndex = fromIndex + (toIndex - fromIndex) / 2;
if (key == array[midIndex]) {
return midIndex;
} else if (key < array[midIndex]) {
toIndex = midIndex - 1;
} else {
fromIndex = midIndex + 1;
}
}
return -1;
}
public static int binarySearch(long[] array,long key) {
//待查找区间为左闭右开
int fromIndex = 0;
int toIndex = array.length;
while (toIndex > fromIndex) {
int midIndex = fromIndex + (toIndex - fromIndex) / 2;
if (key == array[midIndex]) {
return midIndex;
} else if (key < array[midIndex]) {
toIndex = midIndex;
} else {
fromIndex = midIndex + 1;
}
}
return -1;
}
注意:只有在数组有序的情况下,才可以进行二分查找。
4.3.1 Java实现
long[] a = {1,2,3,4,5};
long[] b = {1,2,3,4,5};
System.out.println(a == b);
//不能这样判断两个数组中的元素是否相等,这判断的是两个数组的引用是否相等,那么其输出结果就是错误的
System.out.println(Arrays.equals(a,b));
4.3.2 自实现
public static boolean equals(long[] a,long[] b){
//比较两个数组的长度
if(a.length == b.length){
return false;
}
for (int i = 0; i < a.length; i++) {
if(a[i] != b[i]){
return false;
}
}
return true;
}
4.4.1 Java实现
long[] a = {1,2,3,4,5};
Arrays.fill(a,5);//将数组元素全部用5来填充
Arrays.fill(a,1,3,5);//将数组下标为1和2的元素用5填充
4.4.2 自实现
public static void fill(long[] a, long key) {
for (int i = 0; i < a.length; i++) {
a[i] = key;
}
}
public static void MyFill(long[] a,int fromIndex,int toIndex,long key){
for (int i = fromIndex; i < toIndex; i++) {
a[i] = key;
}
}
4.5.1 Java实现
long[] a = {1,2,3};
long[] a1 = Arrays.copyOf(a,2);//在这个情况下,复制的新长度是2,所以只复制1,2
long[] a2 = Arrays.copyOf(a,3);//在这个情况下,复制的新长度是3,刚好等于原长度,则复制出来的数组为1,2,3
long[] a3 = Arrays.copyOf(a,4);//在这个情况下,复制的新长度为4,超出原长度,则则在超出的地方补0
long[] a4 = Arrays.copyOfRange(a,1,2);//将数组下标为1的数组复制出来
long[] a5 = Arrays.copyOfRange(a,-1,2);//左边下标越界,异常
long[] a6 = Arrays.copyOfRange(a,1,4);//右边下标越界,在尾部自动补0
4.5.2 自实现
public static long[] copyOfRange(long[] original,int fromIndex,int toIndex){
long[] newArray = new long[toIndex - fromIndex];
//设置i为新数组的下标
//当toIndex < original.length 时,一共要复制toIndex - fromIndex个元素
//当toIndex == original.length 时,一共要复制toIndex - fromIndex个元素
//当toIndex > original.length 时,一共要复制original.length - fromIndex个元素
for(int i = 0;i < Math.min(original.length,toIndex) - fromIndex;i++){
newArray[i] = original[fromIndex + i];
}
return newArray;
}
public static long[] copyOf(long[] original,int newLength){
//定义一个新的长度的数组
long[] newArray = new long[newLength];
//三种情况:original.length > newLength
//original.length == newLength
//original.length < newLength
for(int i = 0;i < Math.min(original.length,newLength);i++){
newArray[i] = original[i];
}
return newArray;
}
4.6.1 Java实现
long[] a = {1,2,3};
String s = Arrays.toString(a);
4.6.2 自实现
public static String toString(long[] array){
String r = "[";
for(int i = 0;i < array.length - 1;i++){
r += (array[i] + ",");
}
if(array.length >= 1) {
r += array[array.length - 1];
}
r += "]";
return r;
}
在使用时输入原数组、原数组复制的开始下标、目标数组,目标数组的开始下标,拷贝长度。
int[] a = {1,2,3,4,5};
int[] b = new int[7];
System.arraycopy(a,1,b,2,4);
按照从前到后的顺序,访问数组中的每个元素(使用a.length来获取数组的长度)
for(int i = 0;i < a.length;i++){
System.out.println(a[i]);
}
//便捷的数组遍历方式
//遍历a中的每个元素,把元素的值赋予e
//下面这种方法虽然便捷,但不能从中间开始遍历
for(int e:a){
System.out.println(e);
}
public static void swap(double[] array,int i ,int j){
double t = array[i];
array[i] = array[j];
array[j] = t;
}
public static void swap(int[] a,int[] b){
int[] tmp = a;
a = b;
b = tmp;
}
int[] a = {1,2,3};
System.out.println(a[3]);
对一个值为null的引用做解引用操作时,会出现空指针异常。
int[] a = null;//null代表让a引用不关联任何对象,不能对其解引用
System.out.println(a.length);
对于引用类型来说,形参的改变不影响实参(除通过引用改对象之外)。一个对象可以被多个引用指向,而一个引用只能指向一个或0个对象,不能指向多个。
注意:在下面这种情况下,a引用为空也不会出错。
int[] a = {1,2,3};
int[] b = a;
b[1] = 5;
从以上步骤可以看出,当执行了b[1] = 5时,a中的值发生了变化,a[1] = 5。
四、多维数组
二维数组实际上就是将多个一维数组整合在一起的一个数组,多(n)维数组是将多个(n-1)维数组整合到一起。下面通过对二维数组的相关操作来理解多维数组。
多维数组 | 形式 | 类型 |
一维数组 | long[] a; | long |
二维数组 | long[][] b; | long[],是引用类型 |
long[][] a = new long[10][];
因为类型为long[],是引用类型,引用类型的默认值是null,所以该数组十个元素的值都为null。a[3]得到的类型为long[],a[3][0]代表从a这个数组取出下标是3的元素,元素类型为long[],所以从语法上讲,这种情况下还可以取出元素中的元素,但是所有默认值都为null,对其解引用就会出现空指针异常。
long[][] a7 = {
{1,2,3},
{4},
{5,6,7,8,9},
null,
{10}
};
long[][] a8 = new long[][]{
new long[]{1,2,3},
new long[]{4,5}
};
综上所述,数组的大部分知识就以归纳完毕,如有错误,请指正!