day04_数组
一维数组
存放数据、长度和类型是固定的
数组定义格式
- 格式一:数据类型[ ] 数组名;
例:
int[] arr;
double[] arr;
char[] arr;
- 格式二:数据类型 数组名[ ];
例:
int arr[];
double arr[];
char arr[];
数组动态初始化
-
只给定数组的长度,由系统给出默认初始化值
-
格式:
数据类型[] 数组名 = new 数据类型[数组长度]; //new 表示为数组开辟内存空间
数组静态初始化
-
在创建时直接将数组中元素确定,由系统计算数组长度
-
完整版格式:
数据类型[] 数组名 = new 数据类型[]{元素1,元素2,...};
-
简化版格式:
数据类型[] 数组名 = {元素1,元素2,...};
数组元素访问
-
索引:每个存储到数组的元素,都自动拥有一个编号,从0开始,这个编号称为数组索引(index),可以以此访问到数组中的元素
-
访问数组元素格式:
数组名 [索引];
内存分配
- 方法区:存储可以运行的
class
文件 - 堆内存:存储对象或者数组,new来创建的,都存储在堆内存
- 方法栈:方法运行时使用的内存,比如
main
方法运行,进入方法栈中执行,局部变量都在栈内存中
索引越界异常
-
数组的索引范围:0~length-1
-
出现原因:
int[] arr = new int[3]; System.out.println(arr[3]); //索引范围为0~2,此时访问了一个为3的索引没程序运行后将会抛出数组越界异常
-
ArrayIndexOutOfBoundsException
——数组索引越界异常
空指针异常
-
出现原因:
int[] arr = new int[3]; arr = null; System.out.println(arr[0]); //arr = null 意味着arr将不会在保存数组的内存地址,也就不允许操作数组了
-
NullPointerException
——空指针异常
数组遍历
-
通用的遍历格式:
for(int i = 0;i < arr.length;i++){ System.out.println(arr[i]); }
数组最值
-
从数组所有元素中找出最大值/最小值
-
实现思路:
定义变量max/min,保存数组0索引上的元素 遍历数组,获取数组中的每个元素 将遍历到的每个元素和max/min比较 较大/较小的一方再赋值给max/min 遍历结束后,max/min即为数组的最大/最小值
数组元素反转
-
数组中的元素颠倒顺序
-
分析:
把0索引与
arr.length-1
交换把1索引与
arr.length-2
交换…
只做到
arr.length/2
即可,只做一半,不然又调回来了
二维数组
- 二维数组就是这个二维数组中有多少个一维数组,每个一维数组有多少个元素
二维数组的格式
格式一
数据类型[][] 变量名 = new 数据类型[m][n];
-
格式解释:
- m表示该二维数组中有多少个一维数组
- n表示每一个一维数组中有多少个元素
格式二
数据类型[][] 变量名 = new 数据类型[m][];
- 格式解释:没有给一维数组的元素个数,可以动态给出
格式三
数据类型[][] 变量名 = new 数据类型[][]{{元素,...},{元素,...},...};//标准版
数据类型[][] 变量名 = {{元素,...},{元素,...},...};//简化版
二维数组遍历
for(int y = 0; y < arr.length;y++){
for(int x = 0; x < arr[y].length;x++){
System.out.println(arr[y][x]);
}
System.out.println();
}
数组的排序和查找
冒泡排序
-
相邻元素两两比较,大的往后放,第一次比较完毕,最大值出现在最大索引位置
-
附作业代码:
package cn.zuoye; /** * @Auther: 不学无墅 * @Date: 2023/7/10 18:49 * @Desc: 作业4:冒泡排序 */ public class zuoye4 { public static void main(String[] args) { int arr[] ={88,52,97,18,44,56,84}; for (int y = 0; y < arr.length-1; y++) { for (int x = 0; x < arr.length-1-y; x++) { if(arr[x]>arr[x+1]){ int temp = arr[x]; arr[x] = arr[x+1]; arr[x+1] = temp; } } } System.out.print("["); for (int i = 0; i < arr.length; i++) { if(i == arr.length-1){ System.out.print(arr[i]); }else{ System.out.print(arr[i]+","); } } System.out.println("]"); } }
选择排序
-
从0索引开始,依次和后面的元素比较,小的放前面,第一次比较完毕后,最小值在最小索引处
-
附作业代码:
package cn.zuoye; /** * @Auther: 不学无墅 * @Date: 2023/7/10 19:02 * @Desc: 作业5:选择排序 */ public class zuoye5 { public static void main(String[] args) { int arr[] ={88,52,97,18,44,56,84}; for (int y = 0; y < arr.length-1; y++) { for (int x = 0; x < arr.length-1-y; x++) { if (arr[y] > arr[y+1+x] ){ int temp = arr[y]; arr[y] = arr[y+1+x]; arr[y+1+x] = temp; } } } /* for (int x = 0; x < arr.length -1; x++) { for (int y = x + 1; y < arr.length; y++) { if(arr[y] < arr[x]){ int temp = arr[y]; arr[y] = arr[x]; arr[x] = temp; } } } */ System.out.print("["); for (int i = 0; i < arr.length; i++) { if (i == arr.length-1){ System.out.print(arr[i]); }else{ System.out.print(arr[i]+","); } } System.out.println("]"); } }
二分查找
-
前提:数组必须是有序的
-
思路:每次都猜中间的元素,比较大小,一次排除一半的范围
-
附作业代码:
package cn.zuoye; /** * @Auther: 不学无墅 * @Date: 2023/7/10 19:15 * @Desc: 作业6:二分查找 */ public class zuoye6 { public static void main(String[] args) { int[] arr = { 11, 22, 33, 44, 55, 66, 77 }; int value = 66; int max = arr.length-1; int min = 0; int mid = (max+min)/2; while(value != arr[mid]){ if(value<arr[mid]){ max = mid-1; }else if(value > arr[mid]){ min = mid+1; } mid = (max+min)/2; } System.out.println("查找的值的索引为:"+mid); } }