数组

    科技2022-07-10  143

    数组

    变量是存储数据最小的容器 概念: 长度固定 内容可变 可以存储多个同一数据类型值的容器 定义数组: 格式一: 数据类型[] 数组名 = new 数据类型[数组的长度]; 例如: int[] ages = new int[3]; 特点: 在创建时显示指定数组的长度 没有给出初值 但是这种方式创建的数组中的元素会有默认值 byte short int类型的默认值为0 ong类型的默认值为0L 输出也是0 float double类型的默认值为0.0 char类型的默认值’\u0000’ boolean类型的默认值 false 引用数据类型的默认值为 null 格式二: 数据类型[] 数组名 = new 数据类型[]{元素1,元素2,元素3,…}; 例如: int[] ages = new int[]{18,20,19}; 特点: 在创建时直接给出了元素的初值,数组的长度等于元素的个数 格式三: 数据类型[] 数组名 = {元素1,元素2,元素3,…}; 例如: int[] ages = {18,20,19}; 特点: 在创建时直接给出了元素的初值,数组的长度等于元素的个数 此形式是格式二的简化形式 注意: 格式一和格式二支持先声明再赋值,格式三不支持 编译会报错 数组的基本操作: 1、获取数组的元素 数组创建之后会给每个元素一个编号或者称之为下标 索引 下标的取值范围: 0 ~ 数组的长度-1 格式: 数组名[下标] 2、设置或者修改数组元素的值 格式: 数组名[下标] = 指定的数据值; 3、获取数组的长度 格式: 数组名.length 4、数组的遍历–查询数组所有的元素 方式一: 普通的循环 while for for(int i=0;i<=数组名.length-1;i++){ syso(数组名[i]); } 方式二:增强for循环 foreach 数组 集合 格式: for(数据类型 临时变量名 : 要遍历的数组名){ 通过临时变量来获取数组当前元素的值 } 执行流程: 将要遍历的数组中的所有元素按照顺序依次赋值给临时变量 方式三:使用Arrays工具类 Arrays.toString(数组名);//获取数组所有元素组成的一个字符串

    三种方式的对比: 1、如果只是要查询数组所有元素的值 用方式三简单方便;但是方式不灵活;通常用于开 发期间测试或者错误调试 或者 数组转字符串的场景 2、方式一:最灵活;可以通过下标来操作数组中的指定元素; 3、方式二:通常只用于获取数组的元素值 但是因为这种方式无法获取数组的下标 所以通常无法修改数组的元素值; 总结: 增强for循环只能查询 不能增删改 方式三:不支持对于数组元素的操作; 数组的高级操作 1、获取数组的最大值/最小值 //获取数组的最大值 int[] nums = {2,1,3,8,5}; int max = nums[0]; for(int i=1;i<nums.length;i++){ if(max<nums[i]){ max = nums[i]; } } //获取数组的最小值 System.out.println(“最大值为:”+max); int[] nums = {2,1,3,8,5}; int min = nums[0]; for(int i=1;i<nums.length;i++){ if(min>nums[i]){ min = nums[i]; } } System.out.println(“最小值为:”+min); 2、数组所有元素求和 //增强foreach int[] nums = {2,1,3,8,5}; int sum = 0; for(int num:nums){ sum+=num; } System.out.println(“该数组所有元素的和为:”+sum); 3、数组查找指定元素 如果查到了则输出该元素所在的下标 //数组查找指定元素 //如果查到了则输出该元素所在的下标 int[] nums = {2,1,3,8,5,3}; int target = 13;//要查找的元素值为8 boolean flag = false;//false 没找 true找到了 for(int i=0;i<=nums.length-1;i++){ //判断target和当前正在遍历的元素是否相等 if(target==nums[i]){ flag= true; System.out.println(“找到了 下标为:”+i); //break;//如果这里添加了break 则只能查找到第一个元素 } } if(!flag){ System.out.println(“没找到”); }

    优点和缺点: 优点:如果数组中有多个要查找的元素 这种方式可以获取所以匹配元素的下标 容易理解 缺点:效率低 4,二分查找(折半查找) 前提:数组必须有序 代码如下: int[] nums = {1,3,5,6,7,8,9}; //target表示要查找的元素值 int target = 4; int min = 0; int max = nums.length-1; int mid = (min+max)/2; if(target>=nums[min]&&target<=nums[max]){ //进入这里说明target有必要去查找 while(true){ if(target==nums[mid]){ System.out.println(“找到了 下标为:”+mid); break; }else if(target>nums[mid]){ min = mid+1; }else if(target<nums[mid]){ max = mid-1; } mid = (min+max)/2; if(min>max){ System.out.println(“找不到了”); break; } } }else{ System.out.println(“找不到”); } 5、数组排序–数值型–冒泡排序 选择排序 冒泡排序: //从小到大 --冒泡排序 int[] nums = {6,2,5,3,1}; for(int i=1;i<=nums.length-1;i++){//i 轮数 //当前表示第i轮的比较 for(int j=0;j<=nums.length-1-i;j++){//j表示要比较的两个数的前一个的数的下标 //nums[j] nums[j+1] if(nums[j]>nums[j+1]){ //交换位置 int temp = nums[j]; nums[j] = nums[j+1]; nums[j+1] = temp; } } } System.out.println(Arrays.toString(nums)); 选择排序: int[] nums = {6,1,3,1,2,5}; for(int i=1;i<=nums.length-1;i++){//i轮数 //j表示比较的两个数的后一个数的下标 for(int j=i;j<=nums.length-1;j++){ //比较i-1和j数值的大小 if(nums[i-1]>nums[j]){ //交换位置 int temp = nums[i-1]; nums[i-1] = nums[j]; nums[j] = temp; } } } //输出结果 System.out.println(Arrays.toString(nums));

    //轮数不变的 //先定义存储当前要归为值的下标index 初始值:i-1 //index的值和j的值进行比较如果index的值大于j的值 则将j的值给index //当一轮比较完成 则index存储的是当前要归位的元素的值的下标 交换位置即可 //每轮只交换一次就可以完成当前轮的归位 效率较高 int[] nums = {6,1,3,1,2,5}; for(int i=1;i<=nums.length-1;i++){//i轮数 int index = i-1; for(int j=i;j<=nums.length-1;j++){ if(nums[index]>nums[j]){ index = j; } } //内层循环完成 则index中存储的是当前轮要的值的下标 交换位置 //如果index==i-1 说明当前index的值就是最小值 不用交换位置 //如果不相等 则需要交换位置 if(index != i-1){ int temp = nums[index]; nums[index] = nums[i-1]; nums[i-1] = temp; } } System.out.println(Arrays.toString(nums));

    数组的反转 方式一: for(int i=0;i<=(nums.length-1)/2;i++){ int temp = nums[i]; nums[i] = nums[nums.length-1-i]; nums[nums.length-1-i] = temp; } System.out.println(Arrays.toString(nums)); 方式二: int[] nums = {6,1,3,1,2,5}; for(int start=0,end=nums.length-1;start<end;start++,end–){ int temp = nums[start]; nums[start] = nums[end]; nums[end] = temp; } System.out.println(Arrays.toString(nums));

    数组的扩容 数组长度是固定的 创建一个新的数组,将原来数组的元素拷贝到新的数组中; 方式一: 自己遍历完成复制 方式二:System.arraycopy System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length) src:原数组的名称 srcPos:原数组起始下标 dest,:目标数组 destPos:目标数组起始下标 length:复制的元素的个数/长度 int[] nums = {6,1,3}; int[] nums1 = new int[6]; 方式三:Arrays.copyOf copyOf(int[] original, int newLength) original:原数组的名称 newLength:扩容之后的长度 int[] nums = {6,1,3}; nums = Arrays.copyOf(nums,nums.length*2); 总结:Arrays.copyOf的底层就是基于System.arraycopy来实现的

    Processed: 0.010, SQL: 8