数组的概述
数组的特点:数组是有序排列的。
1、数组属于引用数据类型的变量。数组的元素既可以是基本数据类型也可以是引用数据类型。
2、创建数组对象会在内存中开辟一整块连续的空间,而数组名中引用的是这块连续空间的首地址。
3、数组的长度一旦确定,就不能修改。
数组的分类
按照维度:一维数组、二维数组、三维数组、…
按照元素的数据类型:基本数据类型元素的数组、引用数据类型元素的数组(即对象数组)
一维数组的使用
一维数组的声明和初始化
数组一旦初始化完成,其长度就确定了。
数组元素的引用
数组的角标从0开始,到数组的长度减一结束。
使用属性length
可以获取数组的长度。
增强遍历一维数组(foreach)
int[] a = new int[]{1,2,3,4};
for(int e : a){
System.out.println(e);
}
//--------------------------------------
String[] names = {"beibei", "jingjing"};
for (String name : names) {
System.out.println(name);
}
数组元素的默认初始化值
内存解析
内存的简化结构
一维数组的内存解析
多维数组的使用
对于二维数组的理解,我们可以看成是一维数组 array1又作为另一个一维数组array2的元素而存在。其实,从数组底层的运行机制来看,其实没有多维数组。
二维数组的声明和初始化
二维数组的引用
int[][] arr = new int[][]{{1,2,3,},{4,5},{6,7,8}};
System.out.println(arr[0][1]);
输出
2
二维数组的长度
int[][] arr = new int[][]{{1,2,3,},{4,5},{6,7,8}};
System.out.println(arr.length);
输出
3
System.out.println(arr[1].length);
输出
2
遍历二维数组
使用嵌套循环
int[][] arr = new int[][]{{1,2,3,},{4,5},{6,7,8}};
for(int i = 0;i < arr.length;i++){
for(int j = 0;j < arr[i].length;j++){
System.out.print(arr[i][j]);
}
} 输出
12345678
二位数组的元素默认初始值
int[][] arr = new int[4][3];
System.out.println(arr[0]);
System.out.println(arr[0][1]);
输出
[I@15db9742
//外层数组默认值为地址值
0
//内层数组默认值为对应类型一维默认值
二维数组的内存解析
数组中涉及到的常见算法
二分法查找
要求:要查找的数组必须有序
设置首位索引的方法,不断地取中间值。
/**
* 二分查找法
*/
public static int binSearch(int[] a,int b){
int low = 0;
int high = a.length - 1;
while (low <= high){
int mid = (low + high)/2;
if (a[mid] < b){
low = mid + 1;
}else if(a[mid] == b){
return mid;
}else {
high = mid - 1;
}
}
return -1;
}
常用方法
Arrays工具类的使用
System.arraycopy
//src: 原数组
//srcPos: 原数组起始位置(从这个位置开始复制)
//dest: 目标数组
//destPos:目标数组粘贴的起始位置
//length: 复制的个数
public static native void arraycopy(Object src, int srcPos, Object dest, int destPos, int length);