Java---数组概念和应用场景、遍历方法、经典习目详细解析,外加Arrays类中数组使用的一些方法。

数组

引入

   考试结束后,老师给冰冰分配了一项任务,让他计算全班(30人)的平均分。

   解决办法:定义三十个变量,然后相加求和,并计算平均分。

  数组: 存储一组相同数据类型的容器
       本质就是一个变量的容器

数组的格式:

   数据类型[] 数组名 = new 数据类型[n];

   1.数据类型: 这里可以是八大基本数据类型,也可以是引用数据类型

   2.数组名本质也是一个变量名,满足变量的命名规范
      第一个单词首字母小写,其他单词首字母大写,见名知意,名词,一般是复数

   3.既然是数组名是一个变量,它是引用数据类型,就应该满足变量的三要素,先声明后赋值,再使用
      数组的初始化
            声明: 告诉计算机开辟多大的连续的内存空间
            赋值: 通过数组的下标、索引来访问数组的每一个元素

   4.new 表示向堆区申请内存空间,申请空间之后会被系统分配一个地址值
      产生地址我们需要使用new关键字,我们是不能够手动编写地址值的

   5.n表示数组的长度,就是这个容器的大小

   6.数组容器中的每一个元素的访问格式:
      数组名[下标/索引]
      这里的下标从0 ~ n - 1

   7.内存原理
     int[] scores ;
     scores = new int[5];
在这里插入图片描述

数组的初始化

   静态初始化

      1. 初始化的同时为每个元素赋值,不需要指明长度

      2.由用户来给出数组的元素内容

   格式一: 数据类型[] 数组名 = new 数据类型[]{元素1,元素2,元素3,…};
  格式二: 数据类型[] 数组名 = {元素1,元素2,元素3,…};
      int[] scores = {100,70,98,67}; //创建数组对象并初始化,存放4个成绩

   动态初始化

      1.系统需要指定数组的长度

      2.数组中的每一个元素都会被赋予默认值,默认值的规律满足堆区分配值的规律
         byte short int long 默认0
         float double 默认0.0
         boolean 默认 false
         char 默认 ‘\u0000’
         引用类型 默认 null

      3.可以后期动态来确定初始值
         a.通过数组的索引一个一个赋值
         b.通过键盘输入
         c.通过随机数

   数组的赋值
   数组创建完毕后可以通过下标对每个元素进行赋值

      下标从0开始
      数组长度 length,下标最大 length-1
          int[] scores = new int[5];
          scores[0] = 70;
          scores[1] = 90;
在这里插入图片描述

  数组的遍历: 访问到数组的每一个元素
     for (int i = 0; i < 3; i++) {
       System.out.println(arr[i]);
     }

  数组有一个属性: length,能够动态获取数组的长度
    可将遍历方法改进为
       for (int i = 0; i < arr.length; i++) {
         System.out.println(arr[i]);
       }

代码示例

public class ArrayDemo02 {
	public static void main(String[] args) {
		// 动态初始化
		int[] arr = new int[5];
		
		Scanner input = new Scanner(System.in);
		
		// c.通过随机数
		for (int i = 0; i < arr.length; i++) {
			arr[i] = (int) (Math.random() * 100);
		}
		
	}

	// b.通过键盘输入
	private static void method2(int[] arr, Scanner input) {
		for (int i = 0; i < arr.length; i++) {
			System.out.print("请输入第" + (i + 1) + "个元素: ");
			arr[i] = input.nextInt();
		}
		
		System.out.println(Arrays.toString(arr));
	}

	public static void method1(int[] arr) {
		// 通过数组的索引一个一个赋值
		arr[0] = 10;
		arr[1] = 20;
		arr[2] = 30;
		
		//打印输出
		/*System.out.println(arr[0]);
		System.out.println(arr[1]);
		System.out.println(arr[2]);*/
		
		//使用for循环遍历
		for (int i = 0; i < 3; i++) {
			System.out.println(arr[i]);
		}
	}
}

经典习题

  1、考试结束后,老师给冰冰分配了一项任务,让他计算全班(30人)的平均分。

public class ArrayDemo05 {
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		double[] scores = new double[30];
		
		double sum = 0;
		double averageScore = 0.0;
		for (int i = 0; i < scores.length; i++) {
			System.out.print("请输入第" + (i + 1) + "个学生的成绩: ");
			scores[i] = input.nextDouble();
			sum += scores[i];
		}
		
		averageScore = sum / scores.length;
		System.out.println("30个童鞋的平均分是: " + averageScore);
	}
}

  2、有一个数列:8, 4, 2, 1, 23, 344, 12

     A 循环输出数列的值。arrayToString
     B 求数列中所有数值的和。
     C 求出最大值。
     D 将数组倒置并输出

public class ArrayDemo06 {
	public static void main(String[] args) {
		int[] arr = {8, 4, 2, 1, 23, 344, 12};
		
		System.out.println(Arrays.toString(arr));
		System.out.println("所有数列元素的和: " + getSum(arr));
		System.out.println("所有元素的最大值为: " + getMaxValue(arr));
		System.out.println("所有元素的最小值为: " + getMinValue(arr));
		
		reverseArray(arr);
		System.out.println(Arrays.toString(arr));
		
		
	}
	
	/**
	 * 功能: 循环输出数列的值
	 * @param arr 需要遍历的数组
	 */
	public static void printArray(int[] arr) {
		for (int i = 0; i < arr.length; i++) {
			System.out.println(arr[i]);
		}
	}
	
	/**
	 * 功能: 求数列中所有数值的和。getSum
	 * @param arr 需要对数组中的每一个元素遍历求和
	 * @return 数组中所有元素相加的和
	 */
	public static int getSum(int[] arr) {
		int sum = 0;
		for (int i = 0; i < arr.length; i++) {
			sum += arr[i];
		}
		return sum;
	}
	
	/**
	 * 最值思想
	 * 功能: 求出最大值。
	 * @param arr 
	 * @return 获取数列中的最大值
	 */
	public static int getMaxValue(int[] arr) {
		// 1.假定数组的第一个数为最大值
		int max = arr[0];
		// 2.遍历数组中的每一个元素,获取到每一个元素,和假定的max进行比较
		for (int i = 0; i < arr.length; i++) {
			// 如果这个元素比假定的最大值max还要大,就更新最大值
			if (arr[i] > max) {
				max = arr[i];
			}
		}
		return max;
	}
	
	/**
	 * 最值思想
	 * 功能: 求出最小值。
	 * @param arr 
	 * @return 获取数列中的最小值
	 */
	public static int getMinValue(int[] arr) {
		// 1.假定数组的第一个数为最小值
		int min = arr[0];
		// 2.遍历数组中的每一个元素,获取到每一个元素,和假定的min进行比较
		for (int i = 0; i < arr.length; i++) {
			// 如果这个元素比假定的最小值min还要小,就更新最小值
			if (arr[i] < min) {
				min = arr[i];
			}
		}
		return min;
	}
	
	/**
	 * 功能: 将数组倒置并输出
	 * @param arr
	 * 
	 * 思路:
	 * 	[8, 4, 2, 1, 23, 344, 12]
	 *  第一次倒置
	 *  arr[0]和arr[arr.length - 1 - 0] 交换位置
	 *  第二次倒置
	 *  arr[1]和arr[arr.length - 1 - 1] 交换位置
	 *  第三次倒置
	 *  arr[2]和arr[arr.length - 1 - 2] 交换位置
	 *  
	 *  重复了三次,就是交换了3次
	 *  1个数 0
	 *  2个数 1
	 *  3个数 1
	 *  4个数 2
	 *  5个数 2
	 *  6个数 3
	 *  7个数 3
	 *  i个数 i / 2
	 *  
	 *  一共交换的规律 arr.length / 2
	 */
	public static void reverseArray(int[] arr) {
		for (int i = 0; i < arr.length / 2; i++) {
			int temp = 0;
			temp = arr[i];
			arr[i] = arr[arr.length - 1 - i];
			arr[arr.length - 1 - i] = temp;
		}
	}
}

Arrays工具类

  针对数组操作的工具类,方便我们更高效更灵活地处理数组

  Arrays.toString: 输出一个数组,返回字符串

  Arrays.sort: 对数组进行排序

   Arrays.binarySearch: 对数组进行排序

  System.arraycopy: 数组元素的拷贝,这是一个本地方法,不是Java实现的,是C实现的

   Arrays.copyOf: 表示拷贝数组,可以实现元素的拷贝,还能够动态扩容和缩容,集合底层依赖这个方法,这个方法依赖System.arraycopy

   Arrays.copyOfRange: 表示拷贝数组一部分

   Arrays.fill: 填充数组所有元素,还可以填充一部分

   Arrays.equals: 比较两个数组的所有元素是否相等

   asList: 将数组转换成集合

   Arrays.stream: 将数组转换成 流式API

数组长度固定不变,一旦我希望在后期给数组中添加或者删除一个元素,是做不到的

   数组拷贝:
     Java对索引的一个原则: 左闭右开原则 [1,3)

代码示例

ublic class ArraysUtilDemo {
	public static void main(String[] args) {
		int[] arr = {11, 22, 79, 77, 88, 33};
		System.out.println(Arrays.toString(arr));
		
		// Arrays.sort(arr);
		// System.out.println("排序后: " + Arrays.toString(arr));
		
		// Arrays.sort(arr, 2, 5);
		// System.out.println("排序后: " + Arrays.toString(arr));
		
		// System.out.println(Arrays.binarySearch(arr, 79));
		
		// int[] newArray = new int[arr.length + 1];
		
		/*for (int i = 0; i < arr.length; i++) {
			newArray[i] = arr[i];
		}*/
		
		// System.arraycopy(arr, 0, newArray, 0, arr.length);
		
		// int[] newArray = Arrays.copyOf(arr, arr.length - 1);
		
		// int[] newArray = Arrays.copyOfRange(arr, 2, 5);
		
		// newArray[newArray.length - 1] = 100;
		
		// System.out.println(Arrays.toString(newArray));
		
		Arrays.fill(arr, 0);
		System.out.println(Arrays.toString(arr));
		
		Arrays.fill(arr, 1, 4, 100);
		System.out.println(Arrays.toString(arr));
		
		int[] arr2 = Arrays.copyOf(arr, arr.length + 1);
		
		System.out.println(Arrays.equals(arr, arr2));
		
	}
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值