数组的定义:
是存储同一类型数据的集合。
定义数组的两种方式:
1.动态初始化:在定义数组时只定义数组长度,由系统自动赋予数组初始值。
格式:数据类型 [] 数组名 = new 数据类型[元素个数];
例如:int [] arr = new int[3]; 这样就创建了一个有三个元素的数组
2.静态初始化:在定义数组时就对数组进行赋值。
格式1:数据类型[] 数组名 = new 数据类型[]{元素1,元素2,……};
例如:int [] arr = new int []{1,5,6,9};
格式2:数据类型 [] 数组名 = {元素1,元素2,……};
例如: int [] arr = {1,5,9,8};
数组元素的查询:
格式:数组名[索引值]; 索引值从0开始,为第一个数组元素,以此类推。
例如:arr[2];
数组中的常见异常:
ArrayIndexOutOfBoundsException 数组越界异常,常见于查询数组某一元素的索引值大于该数组的索 引。
NullPointerException 空指针异常,变量没有指向一个有效的数组对象,而指向null。常见于定义
一个数组后又将数组变量重置为null。
JVM的内存划分:
操作系统进行管理计算机的各种硬件,JVM请求操作系统分配内存,操作系统从内存中分配一部分。
JVM将系统分配的内存划分为5个区域;
寄存器:内存和cpu之间,用来操作cpu
本地方法栈:虚拟机调用系统中的功能
方法和数据方法区:程序运行时期,.class文件进入的地方
栈内存:所有方法运行时进入的内存
堆内存:存储对象
一个java文件被编译成class文件,进入方法区运行,main等方法进入栈内存运行(main压栈运行),如果有创建对象的语句,
就会在堆内存中开辟空间存放对象
数组创建在内存中的分配情况:
arr这个变量存储的是地址,每次运行之后,jvm就会自动回收内存,导致运行相同代码得到的地址值可能不同。
数组的遍历:
代码:
for(i=0;i<arr.length;i++){
System.out.print(arr[i]+" ");
}
二维数组:
二维数组可以说是数组的数组,是包含数组的数组。
定义格式:
数据类型[][] 数组名 = new 数据类型[二维数组长度][一维数组长度];
int[][] arr = new int [4][5]; 表示建立一个名为arr的二维数组,长度为4,其中每个一维数组的长度为5.
也可以在定义时不注明每个一维数组长度,这时每个一维数组的长度可以不相同。
数据类型[][] 数组名 ={{……},{……},……};
int[][] arr={{12,3,32},{1,3,31,4},{2,4,5,6},{3,7,5}};
二维数组的查询:
arr[2][1]; 这表明查询二维数组的第三个数组的第二个元素。(与一维数组相同,下标索引都是从0开始)
二维数组的遍历:
for(i=0;i<arr.length;i++){
for(j=0;j<arr[i].length;j++){
System.out.print(arr[i][j]+" ");
}
}
int num = 0;
//外层循环用来控制数组循环的圈数
for (int i = 0; i < arr.length-1; i++) {
//length-i-1就是第i次比较,每次比较完毕总是打的在后面所以下一次就不必比较了。 for (int j = 0; j < arr.length-i-1; j++) {
//将大的元素放后面
if(arr[j]>arr[j+1]){
num = arr[j];
arr[j] = arr[j+1];
arr[j+1] = num;
}
}
}
2.选择排序
int num = 0;
//外层循环用来控制数组循环的圈数
for (int i = 0; i < arr.length-1; i++) {
for (int j = i+1; j < arr.length; j++) {
//将大的元素放后面
if(arr[i]>arr[j]){
num = arr[i];
arr[i] = arr[j];
arr[j] = num;
}
}
}