什么是数组
程序=算法+数据结构
算法:解决问题的流程/步骤
数据结构:将数据按照某种特定的结构来保存。
- 数组是最基本的一种数据结构
- 数组是一种数据类型(引用类型)
- 数组也是对象
- 数组对象在堆中存储,数组变量属于引用类型。存储数组对象的地址信息。指向数组对象,数组的元素可以看做成员变量只不过类型全都相同。
- 元素按照线性顺序排列,所谓线性顺序是指除第一个元素外,每一个元素都有唯一的前驱元素。除最后一个元素外,每一个元素都有唯一的后继元素。
- 元素只能通过下标访问。每一个数组下标都是从0开始最大到 元素–1(length-1)结束。
int [] a = new int [6];
声明int型数组a,包含了6个元素
每个元素的类型都是int,默认值为0
int型数组默认值为0。最大下标 为a.length-1
- 声明数组语法
数据类型[] 变量名 = new 数据类型[元素];
例: int[] a = new int[5];
声明数组时不规定数组长度,new关键字分配空间时需指定分配的空间大小 - 初始化数组
int [] arr =new int[3]; //0,0,0
int [] arr ={1,3,5,7};//1,3,5,7
int [] arr = new int[] {1,4,6};//1,4,6 []里不能再写值
int [] arr;
arr={1,3,5};//编译错误
arr = new int [] {1,3,5};//正确
- 数组的访问
通过数组.length可以获取数组的长度
int [] arr = new int[3];
System.out.println(arr.length);//输出结果:3
arr[0] = 100;
arr[1] =200;
arr[2] = 300;
arr[3] =400;//编译没错,一旦运行就会报 数组下标越界异常
System.out.println(arr[arr.length-1]);//输出最后一个元素的值
- 数组的遍历
int [] arr=new int[10];
for(int i = 0;i<arr.length;i++){
arr[i]=100;//10个元素的值都赋值为100
System.out.println(arr[i]);//输出每个元素的值
}
- 数组的复制
System.out.arraycopy 方法用于数组复制
System.arraycopy(src, srcPos, dest, destPos, length);
src:源数组
srcPos:源数组起始位置
dest:目标数组
destPso:目标数组起始位置
length:要复制的数组元素的数量。
int[] arr = new int [10];
int[] arr2 = {10,15,13,123,5};
System.arraycopy(arr2,0,arr,0,arr2.length);
//arr2下标0开始复制到arr,从arr下标0开始,复制5个元素。
- Arrays.copyOf方法复制数组
使用java.util.Arrays类copyOf方法可以实现数组的复制以及扩容。
语法:
int[] arr = new int [10];
int[] arr2 = new int[] {5,1,5,3,4,8};
arr = Arrays.copyOf(arr2, arr2.length);
//输出结果: 5,1,5,3,4,8
arr = Arrays.copyOf(original, newLength);
arr:目标数组
original:源数组
newlength:要复制的元素数量,大于目标数组的时候 用0或者null进行填充。小于目标数组的时候就会进行截取。
- Arrays.copyOf进行数组扩容
int[] arr = new int[10];
arr = Arrays.copyOf(arr,arr.length+1);
System.out.println(arr.length);
输出结果:11,
可以用此方法对数组进行扩容。这不是在原数组进行扩容,而是一个新的数组,数组的长度在创建后是不可改变的,所谓的扩容是指创建一个更大的新数组,并将原有数组的内容复制到其中。
- 数组的排序
所谓排序就是指将数组元素中的值 有大到小,或者由小到大 按一定顺序进行排列。对元素较多的数组,排序算法的优劣至关重要。
常用的排序算法有:插入排序,冒泡排序,快速排序等。
Arrays.sort方法用于数组从小到大升序 排序效率最高,耗时最少
public static void main (String [] args) {
int[] arr=new int[1000];
for(int i =0;i<arr.length;i++) {
arr[i]=(int)(Math.random()*100);
}
long cc = System.currentTimeMillis();
-----------------------------------------------------------------------------------
//冒泡排序耗时:10
for(int a=0;a<arr.length-1;a++) {
for(int j=0;j<arr.length-1-a;j++) {
if(arr[j]<arr[j+1]) {
int t;
t=arr[j];
arr[j]=arr[j+1];
arr[j+1]=t;
}
}
}
-------------------------------------------------------------------------------------
Arrays.sort(arr);// arrays.sort排序耗时:1
-------------------------------------------------------------------------------------
long dd = System.currentTimeMillis();
System.out.println(Arrays.toString(arr));
System.out.println("耗时"+(dd-cc));
}
输出结果:[3, 5, 10, 46, 48, 345]
- 冒泡排序
public static void main (String [] args) {
//冒泡排序
int[] arr=new int[] {10,5,3,46,48,345};
for(int i=0;i<arr.length-1;i++) {
for(int j = 0;j<arr.length-1-i;j++) {
if(arr[j]<arr[j+1]) {
int t ;
t=arr[j];
arr[j]=arr[j+1];
arr[j+1]=t;
}
}
}
System.out.println(Arrays.toString(arr));
}
- Arrays.toString数组格式化输出
例:
int[] arr = {10,20,31,1323,32};
System.out.println(Arrays.toString(arr));
//输出结果 [10, 20, 31,1323,32]
二维数组
初始化二维数组:
int[][] test =new int [4][5];
//初始化了一个test数组类型数组。包含4个元素,每个元素都是int[]型。默认值为null
//每个int[] 数组 包含了5个元素,每个元素都是int。默认值为0
for(int i=0;i<test.length;i++) {
for(int j=0;j<test[i].length;j++) {
test[i][j]=100;
System.out.print("test["+i+"]["+j+"]="+test[i][j]+"\t");
}
System.out.println();
}