黑马程序员___Java基础[02-Java基础语法](三)
十、数组
1、数组的定义
A:概念:同一种类型数据的集合。其实数组就是一个容器。
B:数组的好处:可以自动给数组中的元素从0开始编号,方便操作这些元素。
C:数组的格式:
格式1:当不明确数组中的元素时
元素类型[] 数组名 = new 元素类型[元素个数或数组长度];
示例:int[] arr = new int[5];
格式2:当明确数组中的元素时
元素类型[] 数组名 = new 元素类型[]{元素,元素,……};
示例:int[] arr = new int[]{3,5,1,7};
或 int[] arr = {3,5,1,7};
注意:
int arr[] = new int[5];这种格式java也识别,但不推荐,这种格式是为了照顾C/C++语言的程序员。
arr中存储的是数组实体的地址值,arr[0]中存储的是元素值。
D:什么时候定义数组:当要操作多个同种数据类型的时候,先把这些数据用数组进行存储。
2、数组的内存分配及特点
1) Java程序在运行时,需要在内存中的分配空间,为了提高运算效率,有对空间进行了不同区域的划分。
一共划分了五片区域,每一片区域都有特定的处理数据方式和内存管理方式。
A:栈内存:
用于存储局部变量(在函数中定义的变量:方法内、方法参数上、for循环中)。
当数据使用完,所占空间会立即自动释放。
B:堆内存:
用于存储通过new建立的实例(数组和对象)。
堆内存数据的特点:
a、每一个实体都有内存地址:十六进制表示的
b、堆内存中的变量都有默认初始化值:
byte、short、int——>0
long——>0L
float——>0.0F
double——>0.0(或0.0D)
———————————————其实打印出来都是0
char——>'\u0000'
boolean——>false
引用类型(数组、String、class、interface)——>null
c、当实体不再被使用时,会在不确定的时间内通过java垃圾回收机制被垃圾回收器回收,使其自动释放。
C:方法区:后面讲(暂不考虑)。
D:本地方法区:调用是Windows系统底层资源(暂不考虑)。
E:寄存器:和CPU相关(暂不考虑)。
2) 数组内存图及初始化过程
例如:

数组初始化过程:
A:主函数进栈,然后在main()中有一个数组的引用arr
B:在堆内存中开辟空间,分配内存地址值
C:在堆内存中建立数组对象,并进行默认初始化
D:如果有显示初始化值的,对它进行显示初始化
E:将内存地址赋给栈内存中的arr变量
3、数组操作常见问题
A:数组脚标越界异常(ArrayIndexOutOfBoundsException)
int[] arr = new int[2];
System.out.println(arr[3]);
运行时出现:访问到了数组中的不存在的脚标时发生。
B:空指针异常(NullPointerException)
int[] arr = null;
System.out.println(arr[0]);
运行时出现:arr引用没有指向实体,却还继续访问实体中的元素时发生。
4、数组中常见的操作
A:遍历
数组的属性:length 数组的长度。
格式:数组名.length
实现方式:通过for循环实现
1 //定义功能,用于打印数组中的元素。元素间用逗号隔开。 2 public static void printArray(int[] arr){ 3 System.out.print("["); 4 for(int x=0; x<arr.length; x++){ 5 if(x!=arr.length-1) 6 System.out.print(arr[x]+", "); 7 else 8 System.out.println(arr[x]+"]"); 9 10 } 11 }
B:获取最值(最大值,最小值)
1 /* 2 给定一个数组{5,1,6,4,2,8,9}。 3 获取数组中的最大值,以及最小值。 4 */ 5 6 class ArrayTest 7 { 8 /* 9 获取最大值。 10 */ 11 public static int getMax(int[] arr) 12 { 13 int max = arr[0]; 14 15 for(int x=1; x<arr.length; x++) 16 { 17 if(arr[x]>max) 18 max = arr[x]; 19 } 20 return max; 21 } 22 //操作脚标 23 public static int getMax_2(int[] arr) 24 { 25 int max = 0; 26 27 for(int x=1; x<arr.length; x++) 28 { 29 if(arr[x]>arr[max]) 30 max = x; 31 } 32 return arr[max]; 33 } 34 35 /* 36 获取最小值。 37 */ 38 public static int getMin(int[] arr) 39 { 40 int min = 0; 41 for(int x=1; x<arr.length; x++) 42 { 43 if(arr[x]<arr[min]) 44 min = x; 45 } 46 return arr[min]; 47 } 48 49 public static void main(String[] args) 50 { 51 int[] arr ={5,1,6,4,2,8,9}; 52 int max = getMax_2(arr); 53 int min = getMin(arr); 54 System.out.println("max="+max); 55 System.out.println("min="+min); 56 } 57 58 }
C:排序:将数组中的元素按照升序或降序排列
选择排序:
代码示例:升序排序
1 /* 2 选择排序。 3 内循环结束一次,最值出现头角标位置上。 4 */ 5 public static void selectSort(int[] arr) 6 { 7 for (int x=0; x<arr.length-1 ; x++) 8 { 9 for(int y=x+1; y<arr.length; y++) 10 { 11 if(arr[x]>arr[y]) 12 { 13 int temp = arr[x]; 14 arr[x] = arr[y]; 15 arr[y]= temp; 16 } 17 } 18 } 19 }
特点:第一次内循环结束后,极值出现在了0角标位置。
插入排序:在已排好序的子数列中反复插入一个新元素,直至整个数列全部排好。
代码示例:
冒泡排序:相邻的两个元素进行比较,如果符合条件就换位。
代码示例:降序排序
1 /* 2 冒泡排序 3 */ 4 public static void bubbleSort(int[] arr) 5 { 6 for(int x=0; x<arr.length-1; x++) 7 { 8 for(int y=0; y<arr.length-x-1; y++)//-x:让每一次比较的元素减少,-1:避免角标越界。 9 { 10 if(arr[y]<arr[y+1]) 11 { 12 int temp = arr[y]; 13 arr[y] = arr[y+1]; 14 arr[y+1] = temp; 15 } 16 } 17 } 18 }
特点:第一次比较完以后,极值出现在了最大角标处。
D:查找:在数组中寻找特定元素的过程
无序数组:线性查找
1 //定义功能,获取key第一次出现在数组中的位置。如果返回是-1,那么代表该key在数组中不存在。 2 public static int getIndex(int[] arr,int key) 3 { 4 for(int x=0; x<arr.length; x++) 5 { 6 if(arr[x]==key) 7 return x; 8 } 9 return -1; 10 }
有序数组:折半查找
注意:对数组进行折半查找必须要保证该数组是有序的数组。
E:传递参数
调用的时候,传递是基本类型的值的时候,形参改变对实参没有任何影响。
调用的时候,传递是引用类型的地址的时候,形参改变对实参有直接影响。
5、二维数组
1)定义格式
格式1:int[][] arr = new int[3][2];
A:定义了名称为arr的二维数组
B:二维数组中有3个一维数组
C:每一个一维数组中有2个元素
D:一维数组的名称分别为arr[0], arr[1], arr[2]
arr[0][0],arr[0][1]
arr[1][0],arr[1][1]
arr[2][0],arr[2][1]
arr:二维数组名
arr[1]:二维数组中的第二个一维数组名
arr[1][1]:二维数组中的第二个数组的第二个元素
E:给第一个一维数组1脚标位赋值为78写法是:arr[0][1] = 78;
格式2:int[][] arr = new int[3][];
A:二维数组中有3个一维数组
B:每个一维数组都是默认初始化值null
C:可以对这个三个一维数组分别进行初始化
arr[0] = new int[3];
arr[1] = new int[1];
arr[2] = new int[2];
格式3:int[][] arr = {{3,8,2},{2,7},{9,0,1,6}};
A:定义一个名称为arr的二维数组
B:二维数组中的有三个一维数组
C:每一个一维数组中具体元素也都已初始化
第一个一维数组 arr[0] = {3,8,2};
第二个一维数组 arr[1] = {2,7};
第三个一维数组 arr[2] = {9,0,1,6};
D:第三个一维数组的长度表示方式:arr[2].length;
注意特殊写法情况:int[] x,y[]; x是一维数组,y是二维数组。
例题:
int[]y是一个一维数组
int[]x[]是一个二维数组int[][]x
int[] y, x[];
(a) x=y; //no
(b)x[0]=y; //yes
(c)x[0] = y[0]; //no
(d)x = y[0]; //no
(e)x[0][0] = y[0]; //yes
2)二维数组的遍历
1 int[][] arr2 = new int[2][3]; 2 public static void printArray2(int[][] arr2){ 3 for(int i=0; i<arr2.length; i++){ 4 for(int j=0; j<arr2[i].length; j++){ 5 System.out.print(arr2[i][j]+" "); 6 } 7 System.out.println(); 8 } 9 }
浙公网安备 33010602011771号