【Java】第6章 数组

本文详细介绍了Java中一维数组和多维数组的基础知识,包括声明、创建、初始化、访问元素、复制、排序、查找、遍历等操作。还通过实例演示了如何处理数组,如分析数字、处理一副牌、复制数组、数组传递给方法、统计字母频率、可变长参数列表等。最后,讲解了二维数组的声明、长度获取、不规则数组及处理方法,包括多选题评分、寻找最近点对、数独问题等应用实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一维数组

数组的基础知识

  • 一旦数组被创建,它的大小是固定的。

1、声明数组变量

  • 声明一个数组变量(引用类型)
  • double[] list; double list[];
  • 不同于声明基本数据类型变量,声明一个数组变量时不给数组分配任何内存空间。它存储的是指向数组的引用。

2、创建数组

  • 让引用指向一个数组变量
  • list = new double[10];
  • 说明:new double[10]创建了一个数组,并把这个数组的引用赋值给了变量list,即引用变量指向数组。
  • 总结

  • 一共三个步骤:声明一个数组变量、创建数组、将数组引用赋值给变量
  • 可以合并在一条语句里 double[] list = new double[10];

3、数组大小和默认值

  • 数组名.length 得到数组的大小。
    • 注意数组中length是属性不是方法,没有括号()
  • 创建数组后,它的元素被赋予默认值(默认初始化)。数值型基本数据类型的默认为0char型默认为**‘\u0000’**,boolean型 默认为 **false **。

4、访问数组元素

  • 通过下标访问。下标从0开始。
  • 每个元素可以用下标变量表示:list[0];
  • 下标变量和正常变量的使用方法相同。
    如:list[3] = list[2] + list[1];
	for(int i = 0; i < list.length; i++){
		list[i] = i;
	}

5、数组初始化简写方式

  • 声明数组、创建数组、初始化数组合并到一条语句中。
  • double[] list = {1.9, 2.9, 3.4, 3.5}; //{…}:初始化列表
  • 不使用操作符new。

6、处理数组——for循环

  • 相关操作
    • 循环输入初始化数组
    • 使用随机数初始化数组
    • 显示数组
    • 所有元素求和
    • 找最大值
    • 找最大值最小下标
    • 随机打乱
    • 移动元素
    • 简化编码

7、foreach循环

  • 不用下标变量就可以顺序遍历整个数组。
	for(double i : list){
		System.out.println(i);
	}
  • 变量 i 必须和 list 中元素的数据类型相同
  • 限制
    • 不能修改数组元素
    • 只能顺序遍历

实例1:分析数字

实例:一副牌

复制数组

  • list2 = list1;只能将list1的引用值赋值给list2,在这条语句后,list2引用的数组不能再引用,变成垃圾,被Java虚拟机自动收回,这个过程称为垃圾回收(garbabe collector,主动触发)。
  • 将一个数组变量赋值给另一个数组变量,实际上是将一个数组的引用复制给另一个变量,使两个变量都指向相同的内存地址。
  • 有三种方法
    1. 使用循环,逐个赋值
    2. System类中的静态方法arraycopy(sourceArray, srcPos, targetArray, tarPos, length);
    3. clone方法复制
	int[] srcArray = {2, 3, 1, 5, 10};
	int[] tarArray = new int[srcArray.length];
			/*****方法1*******/
	for(int i = 0; i < srcArray.length; i++){
		tarArray[i] = srcArray[i];
	}
			/******方法2******/
	System.arraycopy(srcArray, 0, tarArray, 0, srcArray.length);
  • arraycopy方法没有给目标数组分配内存空间,复制前必须创建目标数组以及分配给它的内存空间。复制完成后,srcArray和tarArray具有相同的内容,但占有独立的内存空间。
  • arraycopy违反了Java命名习惯(驼峰命名法)。

将数组传递给方法

  • 对于数组类型参数,参数值是数组的引用,给方法传递的是这个引用。
	public static void printArray(int[] array){...}
	//调用
	printfArray(new int[]{3, 1, 2, 6, 4, 2});
  • 该数组没有显示地引用变量,这样地数组称为匿名数组
  • 匿名数组:new 数据类型[] 初始化列表
  • 数组在Java中是对象,JVM将对象存储在一个称作**堆(heap)**的内存区域中。

方法返回数组

  • 当方法返回一个数组时,数组的引用被返回。
	public static int[] reverse(int[] list){
		int[] result = new int[list.length];
		...
		return result;
	}
  • 该方法的数据类型是 int[],数组

实例:统计每个字母出现的次数

  • RandomCharacter类中的getRandomLowerCaseLetter()方法获取一个随机字母

可变长参数列表

数组的查找

1、线性查找

2、二分查找

数组排序

1、选择排序

Arrays类

  • java.util.Arrays类包含各种各样的静态方法,用于实现数组的排序查找、数组的比较填充数组元素,以及返回数组的字符串表示。这些方法都有对所有基本类型的重载方法。

1、排序

	double[] numbers = {6.0, 4.4, 1.9, 2.9, 3.4, 3.5};
	java.util.Arrays.sort(numbers);
	java.tuil.Arrays.parallelSort(numbers);
  • sort(numbers);对整个数组排序。
  • sort(numbers, 1, 3);对numbers[1,2)部分数组排序。
  • parallelSort(numbers);多处理器排序

2、查找

	int[] list = {2, 4, 7, 10, 11, 45};
	java.tuil.Arrays.binarySearch(list, 11);
  • binarySearch方法:二分查找。
  • 前提:数组升序
  • 如果不存在关键字,方法返回-(insertionIndex+1),即返回可以插入的下标。

3、比较

  • java.util.Arrays.equals(list1, list2);

4、填充

  • java.util.Arrays.fill();
	java.util.Arrays.fill(list, 5);//将5填充到list中
	java.util.Arrays.fill(list, 1, 5, 8);//将8填充到list[1,5)中

5、数组->字符串

  • java.util.Arrays.toString(list);

命令行参数

1、向main方法传递字符串

  • main方法的声明具有String[]类型参数args。参数args是一个字符串数组,可以从命令行传送参数。
	public static void main(String[] args){
	
	}

2、实例:计算器

多维数组

二维数组基础

1、声明二维数组变量并创建二维数组

  • 声明二维数组变量:int[][] matrix;int matrix[][];
  • 创建二维数组:matrix = new int[5][5];

2、获取二维数组的长度


	int[] a = new int[3][4];//3行4列
	a.length;    //3
	a[0].length; //4
	a[1].length; //4
	a[2].length; //4

3、不规则数组

  • 各行的长度可以不同。
  • 语法:
	int [][] array = new int[5][]; //先确定行数,列数下边写。
	array[0] = new int[5];
	array[1] = new int[4];
	array[2] = new int[3];
	... ...

处理二维数组

循环

	java.util.Scanner input = new java.util.Scanner(System.in);
	for(int i = 0; i < a.length; i++)
		for(int j = 0; j < a[i].length; j++)
			a[i][j] = input.nextInt();

将二维数组传递给方法

	public static int sum(int[][] m){...}

实例1:多选题测验评分

实例2:找出距离最近的点对

实例3:数独

实例4:每日温度和湿度

实例5:猜生日

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值