数组(Array): 属于引用类型的变量,是多个相同的类型数据按一定顺序(数组是有序的)排列的集合,并只使用一个名字,
并通过编号的方式(角标、下标、索引)对这些数据进行管理。
- 创建数组对象会在内存中开辟一整块连续的空间
- 数组长度一旦确定,就不能修改。
- 数组按维数可分:一维数组、二维数组…;
按照数组元素的类型:基本数据类型元素的数组、引用数据类型元素的数组
- 一维数组
①一维数组的声明和初始化
②如何调用数组指定位子的元素(name[0],角标从0到长度-1)
③如何获取数组的长度(name.length:0到长度-1)
④如何遍历数组(运用循环)
⑤数组元素的默认初始化值:整型为0;浮点型0.0;char类型0或者’\u0000’,非’0’,ASCII码为0的值;boolean为false;应用类型为null
⑥数组内存解析:栈(stack:存放局部变量)与堆(heap:new出来的结构,如对象、数组)
public class ArryTest{
public static void main(String[] args) {
int num=10;
int id=1001;
int[] ids;//声明
//1.1静态初始化:数组初始化和数组元素的赋值操作同时进行
ids=new int[] {1001,1002,1003,1004};
//1.2动态初始化:数组的初始化和数组元素的赋值操作分开进行
String[] names=new String[5];
//只有以上两种正确写法,数组一旦初始化完成,其长度就确定了。
int[] arr4={1,2,3,4}; //也是正确的,类型推断
//错误写法:
//int[] arr1=new int[]; ,没有定义长度或赋值
//int[5] arr2=new int[5]; ,等号左边的[]应该为空
//int[] arr3=new int[3]{1,2,3} ,静态动态的一起了
}
}
- 二维数组:
一维数组的元素还是一维数组:一维数组arry1又作为另一个数组arry2的元素而存在。从数据的底层运行机制来看,其实没有多维数组。
public class ArryTest {
public static void main(String[] args) {
//静态初始化
int[][] arr1=new int[][]{{1,2,3},{4,5},{6,7,8}};
//动态初始化1
String[][] arr2=new String[3][2];
//动态初始化2
String[][] arr3=new String[3][];
//错误的情况
// String[][] arr4= new String[][4];
// String[4][3] arr5=new String[][];
// int[][] arr6=new int[4][3] {{1,2,3},{4,5},{6,7,8}};
//正确
int[] arr4[]=new int[][]{{1,2,3},{4,5},{6,7,8}};
int[] arr5[]={{1,2,3},{4,5},{6,7,8}};
//2.如何调用数组的指定位置的元素
System.out.println(arr1[0][1]);
System.out.println(arr2[1][1]);//null
arr3[1]=new String[4];//之前未指定,外层元素
System.out.println(arr3[1][0]);
//数组长度
System.out.println(arr4.length);//3
System.out.println(arr4[0].length);//3
System.out.println(arr4[1].length);//2
}
}
针对于初始化方式1,比如:int[][] arr=new int[4][3],外层元素,如;arr[0]的初始化值为:地址值;内层元素初始值为:与一维数组初始化情况相同
针对初始化方式二,比如:int[][] arr =new int[4][];外层元素的初始化值为:null;内层元素的初始化值为:不能调用,否则报错。
数组的常见算法
- 数组元素的赋值(杨辉三角、回形数)
- 求数组中元素最大值、最小值、平均值、总和
①获取[a,b]范围内的随机数:(int)(Math.random()*(b-a+1))+a;其中Math.random得到的是double型的数据
②若是数组间的赋值,只有一个new,数组所赋值的是地址,共用一个地址。如:int []x,y;x=new int[6];y=x;相当于新建快捷方式。要开辟两个地址,才可以将值移过去。 - 数组的复制(区别于数组变量的赋值)、反转、查找(线性查找、二分法查找)
①.equals()比较内容
②二分法查找的前提是要查找的数组必须有序 - 排序算法:冒泡排序,比较相邻的元素,其时间复杂度O(n^2):;快排的时间复杂度:O(nlogn);堆排序、归并排序
数组常见异常:
- ArrayIndexOutOfBoundsException:数组角标越界异常;
合理范围:[0,arr.length-1]
越界:arr[-1],arr[arr.length] - NullPointerException:空指针异常
int[] arr=null;
arr[0];//在null情况下调用元素
,