数组
创始人
2024-05-29 23:21:45
0

数组

      • 数组
        • 一、课前问答
        • 二、数组的概念和组成
        • 三、数组的基本使用
          • 3.1 基本使用
          • 3.2 遍历
          • 3.3 数组的默认值
          • 3.4 数组的创建语法
          • 3.5 案例
        • 四、数组的扩容
          • 4.1 自定义扩容的过程
          • 4.2 使用arraycopy
          • 4.3 copyOf
        • 五、数组作为参数和返回值
          • 5.1 作为参数
          • 5.2 作为返回值
        • 六、可变长参数
        • 七、数组排序
          • 7.1 冒泡排序
          • 7.2 选择排序
          • 7.3 插入排序
        • 八、二维数组

数组

一、课前问答

1、方法定义的位置?

2、当方法定义的返回值类型为double时,是否可以return 3?

3、什么叫递归?

二、数组的概念和组成

数组是指存储多个相同类型的值的一组连续的空间。

特点:

  • 类型相同
  • 长度固定
  • 连续空间
public class Demo01 {// 创建数组public static void main(String[] args) {int n;// 引用int [] arr; // 创建一组连续的空间,大小是5个int大小// 创建5个int空间大小,并将首地址赋值到arr中arr = new int[5];// 打印数组的地址(首地址)System.out.println(arr);}
}

数组由多个元素组成,通过数组的名称+下标来访问。可以理解为通过数组的首地址移动多少个(下标)类型单位来访问。

三、数组的基本使用

3.1 基本使用
public class Demo02 {// 创建数组public static void main(String[] args) {// 引用int [] arr; // 创建一组连续的空间,大小是5个int大小// 创建5个int空间大小,并将首地址赋值到arr中arr = new int[5];// 赋值arr[0] = 5;arr[1] = 6;arr[2] = 8;arr[3] = 1;arr[4] = 3;// 取值System.out.println(arr[3]);// 下标越界(超出范围)// Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5System.out.println(arr[5]);}
}
3.2 遍历

使用数组的length属性表示数组的长度。

public class Demo03 {// 生成10个随机数,保存后遍历public static void main(String[] args) {int [] arr = new int[8];Random random = new Random();// length属性表示数组的长度for (int i = 0; i < arr.length; i++) {// 赋值arr[i] = random.nextInt(100);}// 遍历for (int i = 0; i < arr.length; i++) {System.out.println(arr[i]);}}
}
3.3 数组的默认值
public class Demo04 {// 数组的默认值public static void main(String[] args) {// 整数类型的数组,元素默认值为0byte [] arr1 = new byte[3];short [] arr2 = new short[3];int [] arr3 = new int[3];long [] arr4 = new long[3];// 小数类型的数组,元素默认值为0.0float [] arr5 = new float[3];double [] arr6 = new double[3];// 布尔类型的数组,元素默认值为falseboolean [] arr7 = new boolean[3];// char类型的数组,元素默认值为ascii码0 '\0'char [] arr8 = new char[3];System.out.println((int)arr8[0]);// 字符串类型的数组,元素默认值为nullString [] arr9 = new String[3];System.out.println(arr9[0]);String str1 = null;String str2 = "";int [] a = null;int [] b = new int[0];System.out.println(a.length);System.out.println(b.length);}
}
3.4 数组的创建语法
public class Demo05 {// 数组的创建语法public static void main(String[] args) {// 1、先声明,再分配空间,后赋值int [] arr1;arr1 = new int[3];arr1[0] = 5;// 2、声明并分配空间,后赋值int [] arr2 = new int[3];arr2[0] = 45;// 3、声明并赋值(复杂)int [] arr3 = new int[] {1,2,3,5};// 4、声明并赋值(简单)int [] arr4 = {1,2,3,5};// 5、先声明,后直接赋值int [] arr5;
//		arr5 = {1,2,3,5}; // 报错,不能使用简单方式arr5 = new int[] {1,2,3,5}; // 只能使用复杂方式}
}
3.5 案例

求平均数

public class Demo06 {public static void main(String[] args) {int [] arr = {23,15,18,90,7};double d = avg(arr);System.out.println("平均数为:" + d);}// 求数组的平均数public static double avg(int [] arr) {double sum = 0;for (int i = 0; i < arr.length; i++) {sum += arr[i];}return sum / arr.length;}
}

查找数字

public class Demo07 {public static void main(String[] args) {int [] arr = {23,15,18,90,7};Scanner input = new Scanner(System.in);System.out.println("请输入要查找的数字:");int num = input.nextInt();int index = indexOf(arr, num);System.out.println("下标为:" + index);}// 在数组中查找某个数字,并返回下标,不存在则返回-1public static int indexOf(int [] arr, int num) {for (int i = 0; i < arr.length; i++) {if(arr[i] == num) {return i;}}return -1;}
}

四、数组的扩容

步骤:

  • 创建一个新数组,大小为原数组大小+需要新添加的元素个数
  • 将原数组的内容复制到新数组中
  • 将需要添加的元素添加到新数组中
4.1 自定义扩容的过程
public class Demo08 {public static void main(String[] args) {int [] arr = {1,2,3,4,5};int num = 6;// 先创建一个新数组,长度是原数组的长度+需要添加的元素个数int [] arr1 = new int[arr.length + 1];// 复制原数组for (int i = 0; i < arr.length; i++) {arr1[i] = arr[i];}// 添加新元素arr1[arr.length] = num;}
}

将数组{1,2,3,4,5}与数组{6,7,8,9}拼接成一个新数组。

  • 创建一个新数组,大小为原数组1大小+原数组2大小
  • 将原数组1的内容复制到新数组中
  • 将原数组2的内容复制到新数组中的后面
public class Demo09 {// 将数组{1,2,3,4,5}与数组{6,7,8,9}拼接成一个新数组public static void main(String[] args) {int [] arr1 = {1,2,3,4,5};int [] arr2 = {6,7,8,9};int [] newArr = new int[arr1.length + arr2.length];// 将arr1内容放入到newArr中for (int i = 0; i < arr1.length; i++) {newArr[i] = arr1[i];}// 将arr2内容放入到newArr中for (int i = 0; i < arr2.length; i++) {newArr[arr1.length + i] = arr2[i];}}
}
4.2 使用arraycopy

System.arraycopy(arr1, 0, newArr, 0, arr1.length);

参数介绍:

  • 需要复制内容的数组(源数组)
  • 源数组从第几个元素开始复制
  • 目标数组
  • 目标数组的从第几个元素开始存入
  • 复制元素的个数
public class Demo10 {// 将数组{1,2,3,4,5}与数组{6,7,8,9}拼接成一个新数组// 使用System.arraycopy方法public static void main(String[] args) {int [] arr1 = {1,2,3,4,5};int [] arr2 = {6,7,8,9};int [] newArr = new int[arr1.length + arr2.length];// 将arr1内容放入到newArr中System.arraycopy(arr1, 0, newArr, 0, arr1.length);// 将arr2内容放入到newArr中System.arraycopy(arr2, 0, newArr, arr1.length, arr2.length);}
}
4.3 copyOf

Arrays.copyOf(arr1, 2);返回一个新数组。

参数的描述:

  • 需要复制的数组(源数组)
  • 创建新数组的长度,如果超过arr1的长度,则后面的内容使用默认值,如果小于arr1的长度,则将arr1从0开始的部分元素复制
public class Demo11 {// 将数组{1,2,3,4,5}与数组{6,7,8,9}拼接成一个新数组// 使用Arrays.copyOf方法public static void main(String[] args) {int [] arr1 = {1,2,3,4,5};int [] arr2 = {6,7,8,9};// 将arr1内容复制并创建一个新数组newArrint [] newArr = Arrays.copyOf(arr1, 2);// 将arr2内容放入到newArr中System.arraycopy(arr2, 0, newArr, arr1.length, arr2.length);}
}

五、数组作为参数和返回值

5.1 作为参数

基本数据类型是值传递。值传递传的是值,传过去后对原变量没有影响。

其他数据类型是引用传递。传递后两个变量引用相同的地址,此时使用任何一个变量去改变地址上的内容,都会对另一个变量产生影响。

值传递:

public class Demo12 {public static void main(String[] args) {int n = 6;m1(n);System.out.println(n); // 6}public static void m1(int n) {n = 5;}
}

引用传递:

public class Demo12 {public static void main(String[] args) {int [] arr = {1,2,3,4,5};m2(arr);System.out.println(arr[0]); // 10}public static void m2(int [] arr) {arr[0] = 10;}
}
5.2 作为返回值

当方法中创建了新的数组,并且要在方法的外部使用该数组,此时就应该将该数组返回。

public class Demo13 {public static void main(String[] args) {int [] arr = {1,2,3,4,5};int num = 6;arr = add(arr, num);for (int i = 0; i < arr.length; i++) {System.out.println(arr[i]);}}public static int [] add(int [] a, int num) {// 先创建一个新数组,长度是原数组的长度+需要添加的元素个数int [] arr1 = new int[a.length + 1];for (int i = 0; i < a.length; i++) {arr1[i] = a[i];}arr1[a.length] = num;return arr1;}
}

六、可变长参数

可变长参数与数组的异同:

  • 相同
    • 都可以在方法中作为数组类型的参数
    • 在方法中处理时都当作数组处理
  • 区别
    • 可变长参数只能作为方法的参数,而数组可以定义变量
    • 可变长参数只能在方法的参数列表中的最后,而数组可以在任意位置

可变长参数好处是在调用时比较方便,不用创建数组传入,直接使用参数的方式传入,而且可以不传。

// 可变长参数
public class Demo14 {public static void main(String[] args) {m1(1, 2, 3);}public static void m1(int... arr) {for (int i = 0; i < arr.length; i++) {System.out.println(arr[i]);}}
}

七、数组排序

数组排序是将一个数组内的元素按照指定的顺序排列。是一种常见的算法基础。

7.1 冒泡排序
public class Demo01 {public static void main(String[] args) {int [] arr = {13, 50, 27, 12, 9, 48, 33, 25};// 循环轮次for (int i = 0; i < arr.length; i++) {boolean b = true;// 第一轮for (int j = 0; j < arr.length - i - 1; j++) {if(arr[j] > arr[j + 1]) {arr[j] 		= arr[j] ^ arr[j + 1];arr[j + 1] 	= arr[j] ^ arr[j + 1];arr[j] 		= arr[j] ^ arr[j + 1];b = false;}}// 如果在循环过程中,没有出现任何一个交换,表示整个数组有序,退出循环if(b) {break;}System.out.println(Arrays.toString(arr));}
//		// 第一轮比较
//		for (int j = 0; j < arr.length - 0 - 1; j++) {
//			if(arr[j] > arr[j + 1]) {
//				arr[j] 		= arr[j] ^ arr[j + 1];
//				arr[j + 1] 	= arr[j] ^ arr[j + 1];
//				arr[j] 		= arr[j] ^ arr[j + 1];
//			}
//		}
//		System.out.println(Arrays.toString(arr));
//		
//		// 第二轮比较
//		for (int j = 0; j < arr.length - 1 - 1; j++) {
//			if(arr[j] > arr[j + 1]) {
//				arr[j] 		= arr[j] ^ arr[j + 1];
//				arr[j + 1] 	= arr[j] ^ arr[j + 1];
//				arr[j] 		= arr[j] ^ arr[j + 1];
//			}
//		}
//		System.out.println(Arrays.toString(arr));
//		
//		// 第三轮比较
//		for (int j = 0; j < arr.length - 2 - 1; j++) {
//			if(arr[j] > arr[j + 1]) {
//				arr[j] 		= arr[j] ^ arr[j + 1];
//				arr[j + 1] 	= arr[j] ^ arr[j + 1];
//				arr[j] 		= arr[j] ^ arr[j + 1];
//			}
//		}
//		System.out.println(Arrays.toString(arr));}
}
7.2 选择排序
public class Demo02 {// 选择排序public static void main(String[] args) {int [] arr = {13, 50, 27, 12, 9, 48, 33, 25};for (int i = 0; i < arr.length; i++) {int index = i; // 把当前位置当作最小// 循环后面的元素,找到最小值for (int j = i + 1; j < arr.length; j++) {if(arr[j] < arr[index]) {index = j;}}// 如果最小值不在当前的位置,需要交换到当前位置if(index != i) {arr[i] 		= arr[i] ^ arr[index];arr[index] 	= arr[i] ^ arr[index];arr[i] 		= arr[i] ^ arr[index];}}System.out.println(Arrays.toString(arr));//		// 第一轮选择
//		int i = 0;
//		int index = i;
//		for (int j = i + 1; j < arr.length; j++) {
//			if(arr[j] < arr[index]) {
//				index = j;
//			}
//		}
//		if(index != i) {
//			arr[i] 		= arr[i] ^ arr[index];
//			arr[index] 	= arr[i] ^ arr[index];
//			arr[i] 		= arr[i] ^ arr[index];
//		}
//		System.out.println(Arrays.toString(arr));
//		
//		// 第二轮选择
//		i = 1;
//		index = i;
//		for (int j = i + 1; j < arr.length; j++) {
//			if(arr[j] < arr[index]) {
//				index = j;
//			}
//		}
//		if(index != i) {
//			arr[i] 		= arr[i] ^ arr[index];
//			arr[index] 	= arr[i] ^ arr[index];
//			arr[i] 		= arr[i] ^ arr[index];
//		}
//		System.out.println(Arrays.toString(arr));
//		
//		// 第三轮选择
//		i = 2;
//		index = i;
//		for (int j = i + 1; j < arr.length; j++) {
//			if(arr[j] < arr[index]) {
//				index = j;
//			}
//		}
//		if(index != i) {
//			arr[i] 		= arr[i] ^ arr[index];
//			arr[index] 	= arr[i] ^ arr[index];
//			arr[i] 		= arr[i] ^ arr[index];
//		}
//		System.out.println(Arrays.toString(arr));}
}
7.3 插入排序
public class Demo03 {// 插入排序public static void main(String[] args) {int [] arr = {13, 10, 7, 8, 9, 48, 33, 25};// 每次循环是将当前轮次后面一个数字向前插入,所以次数要减一for (int i = 0; i < arr.length - 1; i++) {// 定义在外面是后面需要使用int j = i;// 得到当前轮次的后一个数字int num = arr[j + 1];for (; j >= 0; j--) {// 当前数字如果比要插入的数字大,就往后挪动if(arr[j] > num) {arr[j+1] = arr[j];// 否则停止循环,则当前位置即需要插入的位置}else {break;}}// 将当前插入的数字插入到相应的位置arr[j+1] = num;System.out.println(Arrays.toString(arr));}//		// 第一轮
//		int i = 0;
//		int j = i;
//		int num = arr[j + 1];
//		for (; j >= 0; j--) {
//			if(arr[j] > num) {
//				arr[j+1] = arr[j];
//			}
//		}
//		arr[j+1] = num;
//		System.out.println(Arrays.toString(arr));
//		
//		// 第二轮
//		i = 1;
//		j = i;
//		num = arr[j + 1];
//		for (; j >= 0; j--) {
//			if(arr[j] > num) {
//				arr[j+1] = arr[j];
//			}
//		}
//		arr[j+1] = num;
//		System.out.println(Arrays.toString(arr));
//		
//		// 第三轮
//		i = 2;
//		j = i;
//		num = arr[j + 1];
//		for (; j >= 0; j--) {
//			if(arr[j] > num) {
//				arr[j+1] = arr[j];
//			}else {
//				break;
//			}
//		}
//		arr[j+1] = num;
//		System.out.println(Arrays.toString(arr));
//		
//		// 第四轮
//		i = 3;
//		j = i;
//		num = arr[j + 1];
//		for (; j >= 0; j--) {
//			if(arr[j] > num) {
//				arr[j+1] = arr[j];
//			}else {
//				break;
//			}
//		}
//		arr[j+1] = num;
//		System.out.println(Arrays.toString(arr));}
}

八、二维数组

/*
杨辉三角
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
*/
public class Demo06 {// 杨辉三角public static void main(String[] args) {int row = 10;int [][] arr = new int[row][];// 循环行,使用arr.lengthfor (int i = 0; i < arr.length; i++) {arr[i] = new int[i + 1];// 循环列,使用arr[i].lengthfor (int j = 0; j < arr[i].length; j++) {// 如果是第一列或最后一列if(j == 0 || j == arr[i].length - 1) {// 赋值为1arr[i][j] = 1;}else {// 赋值为上一行的同一列+上一行的前一列arr[i][j] = arr[i - 1][j] + arr[i - 1][j - 1];}}}// 显示杨辉三角for (int i = 0; i < arr.length; i++) {// 循环列,使用arr[i].lengthfor (int j = 0; j < arr[i].length; j++) {System.out.print(arr[i][j] + "\t");}System.out.println();}}
}

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...