> 文章列表 > day09_数组进阶

day09_数组进阶

day09_数组进阶

今日内容

零、 复习昨日
一、作业
二、引用类型[重要]
三、数组拷贝
四、数组扩容
五、数组排序[面试|笔试]
六、Arrays

零、 复习昨日

数组创建后能否改变长度

  • 不能

数组创建后能否存储不同类型的数据

  • 不能

数组动态创建的语法,以int数组为例

  • int[] arr = new int[长度];

数组静态创建的语法,以int数组为例

  • int[] arr = new int[]{1,2,3};
  • int[] arr = {1,2,3};

数组取值

  • 数据类型 变量名= 数组名[下标];

数组赋值

  • 数组名[下标] = 值;

遍历是什么意思

数组的长度属性

  • length, 使用时 arr.length

画数组的内存图

一、作业

数组取最值

   // 数组取最大值public static void printMax() {int[] arr = {3,7,2,5,4,6,1};int max = arr[0]; // 假设第一个最大for (int i = 0; i < arr.length; i++) {// 判断下一个是否比当前最大值还大if (arr[i] > max) {// 如果大,就重新赋值给最大值max = arr[i];}}System.out.println("max = " + max );}

数组求和+平均数

 // 求一个整数数组的平均值public static void printAvg() {int[] arr = {3, 2, 5, 4,  1,6};int sum = 0;for (int i = 0; i < arr.length; i++) {sum += arr[i];}// System.out.println(sum );double avg = 1.0 * sum / arr.length;System.out.println("avg = " + avg );}

评委打分,去掉最高分和最低分

// 邱哥去参加今年歌唱比奖,// 有8个评委打分,(去掉1个最低分,1个最高分)求平均分?public static void printAvgPro() {int[] scoreArr = {7,2,3,9,8,9,8,10};int max = scoreArr[0];int min = scoreArr[0];int sum = 0;for (int i = 0; i < scoreArr.length; i++) {if (scoreArr[i] > max) {max = scoreArr[i];}if (scoreArr[i] < min) {min = scoreArr[i];}sum += scoreArr[i];}// 去掉最高分,最低分double avg = (sum - max - min) * 1.0 / (scoreArr.length - 2);System.out.println(avg );}

根据元素找下标

    // 自定义一个整数数组arr,读入一个整数n,// 如果n 在数组中存在,则输出n 的下标;如果不存在,则输出-1。// 根据元素找下标(如果有重复元素,找的是第一个出现的元素的下标)public static void printIndexByElement(int e) {// int[] arr = {1,2,3,4,2,1};// boolean flag = false;// 是否有该元素// for (int i = 0; i < arr.length; i++) {//     if (arr[i] == e) {//         flag = true;//         System.out.println(i );//         break;//     }// }// if (!flag) {//     System.out.println(-1 );// }int[] arr = {1,2,3,4,2,1};int index = -1;for (int i = 0; i < arr.length; i++) {if (arr[i] == e) {index = i;break;}}System.out.println(index );}

根据下标找元素

    // 根据下标找元素public static void printElementByIndex(int index){int[] arr = {1,2,3,4,2,1};if (index < 0 || index >= arr.length) {System.out.println("给的下标有误!!" );return;}int e = arr[index];System.out.println(e );}

二、引用类型[理解]

Java的数据类型

  • 基本数据类型: 四类八种
  • 引用数据类型
    • 数组
    • 接口

为什么叫做引用数据类型?

int[] arr = int[3];
// 使用数组
arr[0] = 1;
// arr到底是谁? arr其实是地址
// 我们通过arr来操作数组,其实arr引用的是内存中的数组

什么又叫做引用?

// 引用就是一个联系,或者说引用就是对象,引用就是地址
// 只不过在执行时,他会通过引用联系找到内存的对象

引用的是谁?

// 引用的是堆内存的对象,即数组对象
package com.qf.ref;/*** --- 天道酬勤 ---** @author QiuShiju* @desc*/
public class Demo1 {public static void main(String[] args) {// int x = 10;// System.out.println("1. " + x );// changeBaseValue(x);// System.out.println("4. " + x ); // 10int[] arr = {1,2,3,4};System.out.print("第一次: ");for (int i = 0; i < arr.length; i++) {System.out.print(arr[i]+" ");}changeRefValue(arr);System.out.print("\\r\\n第四次: ");for (int i = 0; i < arr.length; i++) {System.out.print(arr[i]+" ");}}// 改变基本类型的值public static void changeBaseValue(int a){System.out.println("2. " + a );a *= 10;System.out.println("3. " + a );}// 改变引用类型的值public static void changeRefValue(int[] arr){System.out.print("\\r\\n第二次: ");for (int i = 0; i < arr.length; i++) {System.out.print(arr[i]+" ");}// 改变数组(每个位置放大10倍)for (int i = 0; i < arr.length; i++) {arr[i] = arr[i] * 10;}System.out.print("\\r\\n第三次: ");for (int i = 0; i < arr.length; i++) {System.out.print(arr[i]+" ");}}
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LdxMU1F2-1681085172918)(https://qiushiju-tuchuang.oss-cn-hangzhou.aliyuncs.com/image/%E5%9F%BA%E6%9C%AC%E7%B1%BB%E5%9E%8B%E4%BC%A0%E9%80%92.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-694f9pPD-1681085172919)(https://qiushiju-tuchuang.oss-cn-hangzhou.aliyuncs.com/image/%E5%BC%95%E7%94%A8%E7%B1%BB%E5%9E%8B%E4%BC%A0%E9%80%92.png)]

总结:

  • 基本类型传参数时是值传递
  • 引用类型传参数时是引用传递,将地址传递,多个引用指向同一个对象
  • 方法内的基本类型会进内存的栈中,随着方法出现,随着方法消失
  • 凡是new的,都会在内存的堆中创建对象
  • 引用类型,引用的是内存中的对象

三、数组拷贝[理解]

数组拷贝: 将数组中的元素复制一份放到另一个数组中.

  • 创建空数组,长度与原数组一样长
  • 遍历原数组
  • 从原数组中取值赋值给新数组

3.1 手动拷贝

// 数组拷贝public static void copy1(){int[] arr = {11,22,33};// 数组拷贝,拷贝完需要再有一个数组int[] arr2 = new int[arr.length];printArray(arr2);for (int i = 0; i < arr.length; i++) {arr2[i] = arr[i];}printArray(arr2);}// 定义一个方法,方便数组遍历public static void printArray(int[] arr) {// [1,2,3]String s = "[";for (int i = 0; i < arr.length; i++) {s = s + arr[i];if (i == arr.length-1) {s += "]";} else {s += ",";}}System.out.println(s );}

3.2 JDK自带方法完成数组拷贝

Arrays.copyOf(参数1,参数2);

  • Arrays 类是JDK提供的,直接用
  • copry 是类的方法
  • 参数1 被拷贝的数组
  • 参数2 新数组的长度
    // 数组拷贝public static void copy2() {int[] arr = {11, 22, 33};int[] arr2 = Arrays.copyOf(arr,6);printArray(arr2);// [11,22,33,0,0,0]}

System.arraycopy(src,pos,dest,destPos,length)

   // 数组拷贝方式3public static void copy3() {int[] arr = {11, 22, 33,44,55};int[] arr2 = new int[8];printArray(arr2);/*** src      the source array.*          原始数组* srcPos   starting position in the source array.*          从原数组哪里开始拷贝* dest     the destination array.*          目的地数组* destPos  starting position in the destination data.* length   the number of array elements to be copied.*/System.arraycopy(arr,1,arr2,1,3);printArray(arr2);}

四、数组扩容[理解]

数组扩容: 数组本身是不能改变长度! 此处说的扩容,是指重新新建一个数组,将原数组的数据拷贝到新数组,然后数组命名重新命名为之前的名字

   public static void main(String[] args) {int[] arr = {1,2,3};printArray(arr);arr = changeLength(arr);printArray(arr);}public static int[] changeLength(int[] arr) {// 扩容: 新建+拷贝+改名int[] arr2 = new int[arr.length * 2];System.arraycopy(arr,0,arr2,0,arr.length);return arr2;}// 定义一个方法,方便数组遍历public static void printArray(int[] arr) {// [1,2,3]String s = "[";for (int i = 0; i < arr.length; i++) {s = s + arr[i];if (i == arr.length-1) {s += "]";} else {s += ",";}}System.out.println(s );}

五、数组排序[面试|笔试]

数组的排序算法: 十大排序算法

插入排序、希尔排序、选择排序冒泡排序、归并排序、快速排序、堆排序、基数排序、计数排序和桶排序

冒选插,快堆希归,桶计基

5.1 冒泡排序

/*** 冒泡排序算法,思路*  相邻两个比较,通过交互位置,大的放后面*/public static void sort1(int[] arr){// 外层循环 比较的趟数// -1 最后一趟不用比较for (int i = 0; i < arr.length - 1; i++) {// 内存循环 每趟内比较的次数// -1 防止下标越界.-i 每趟比较的次数要递减for (int j = 0; j < arr.length-1 - i; j++) {// 如果当前元素比后面的元素大if (arr[j] > arr[j+1]){// 就交换位置int temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;}}}}

day09_数组进阶

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3iUT0DRn-1681085172920)(https://qiushiju-tuchuang.oss-cn-hangzhou.aliyuncs.com/image/%E5%86%92%E6%B3%A1%E6%8E%92%E5%BA%8F.gif)]

5.2 选择排序

选择排序:

  • 先假定第一个位置最小
  • 后续每个属性与最小处进行比较
  • 如果更小.就重新记录最小处的下标
  • …直到全部比较完
  • 然后最小处元素与第一个元素换位

  • 第一遍完毕,从第二个开始再重复一遍
  • 第二遍完毕,从第三个开始再重复一遍
  // 升序排序 : 4,3,1,5,2public static void sort2(int[] arr){// 每一个元素都进行一趟比较for (int i = 0; i < arr.length; i++) {// 每次假定第i个位置的数最小int minIndex = i;// 取后续的每个数for (int j = i; j < arr.length; j++) {// 如果发现后续有哪个数比最小的数还小if (arr[j] < arr[minIndex]) {// 记录最小数的下标minIndex = j;}}// 找到最小值后,与第i个位置交换int temp = arr[i];arr[i] = arr[minIndex];arr[minIndex]  = temp;}}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xBGTCzr5-1681085172920)(https://qiushiju-tuchuang.oss-cn-hangzhou.aliyuncs.com/image/%E9%80%89%E6%8B%A9%E6%8E%92%E5%BA%8F.gif)]

六、Arrays[熟练用]

Arrays是JDK提供的一个操作数据的工具类,其中有很多操作数据的方法.

  • copyOf() 拷贝数组
  • sort() 排序
  • toString() 数组转成String返回
  • ps 使用要导包java.util.Arrays
    public static void main(String[] args) {int[] arr = {4,2,1,3,5};// for (int i = 0; i < arr.length; i++) {//     System.out.println(arr[i] );// }System.out.println(Arrays.toString(arr) );// 排序(从小到大)Arrays.sort(arr);// for (int i = 0; i < arr.length; i++) {//     System.out.println(arr[i] );// }String s = Arrays.toString(arr);System.out.println(s );System.out.println( Arrays.toString(arr));}

附录

index 索引。下标
sum
count
avg
min
max
element 元素
reference 引用
change 改变
value  值
source 源,资源,简写src
position 位置,简写pos
destination 目的目标,简写dest
data  数据
sort 排序