数组的定义和使用

举报
小高先生 发表于 2022/06/01 14:59:33 2022/06/01
【摘要】 数组的一些基础知识

  本来应该继续写线程的总结,但是今天学了数组这一章,觉得很简单,就先把这章总结了吧,明天继续总结线程。数组这章课主要讲解了数组的定义、数组中的数组用法以及数组类常见方法。

一、数组的定义和作用

  为什么需要数组呢,设想一下,如果我们需要给一个班级的每一个学生都录入成绩,正常来说就可以给每个学生创建变量,然后给他们赋值就行,但是这样做是不是很麻烦呀,需要创建好几十个变量,所以我们想简单的处理一下,就这样我们有了数组。

  数组是一种数据类型,存储相同数据类型的一组数据。当我们声明一个变量时,就是在内存空间中开辟一块空间,而声明数组时,就是在内存中开辟一串连续的空间。

  数据基本的概念上面已经说的差不多了,现在讲讲如何定义数组。定义数组有两种方式,分别是动态初始化和静态初始化。

  动态初始化:初始化时只指明数组长度,初始值有系统分配。定义方法为:数据类型[] 数组名 = new 数组类型[长度] 

  静态初始化:声明数组的同时给他们赋值:数据类型[] 数组名 = new 数据类型{元素1,元素2,....};还有一种简化版:数据类型[] 数组名 = {元素1,元素2,....}

  如何访问数组中的某个元素呢?格式是这样的:数组名[索引]

  这节还剩最后一个重点,就是Java中的内存分配。程序在运行中,需要在内存中分配空间,为了提高运算效率,就对空间进行不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式,内存可以分为两类,分别是栈内存堆内存。栈内存用来存储局部变量,局部变量在方法中定义,使用完毕,立即消失。堆内存用来存储new出来的内容。

  数组初始化时,会为存储空间添加默认值:

  • 整数:0
  • 浮点数:0.0
  • 布尔:false
  • 字符:空字符
  • 引用数据类型:null

  下图为访问数组的过程,先在栈中找到地址,在通过地址到了堆内存,访问数据

 

二.数组的遍历

  访问数组元素的时候,总不能一直用System这种一句一句输出,肯定要简化,示例代码如下

package com.huawei.array;
/*
 * 遍历数组:获取数组中的每一个元素
 */
public class ArrayDemo2 {

	public static void main(String[] args) {
		int[] arr = {12,34,700,455};
		//动态表示数组长度:数组名.length
		for(int i = 0;i<arr.length;i++) {
			System.out.println(arr[i]);
		}
	}

}

三.数组中的数组

  数组中的数组的意思就是,现在有一个数组,数组中每一个元素还是一个数组,套娃!举个例子,现在有3个班级,每个班级有5名学生,那创建一个数组可以同时包含这两个信息该怎么创建呢?想象一下,现在有一个数组,他有3个元素,对应的是3个班级,每个班级又是一个长度为5数组,包含一个班级的每名同学,这样一个数组中的数组就创建好了。代码如下:

/*
 * 数组中的数组
 */
public class ArrayDemo3 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[][] array = new int[3][5];
		array[0][0] = 95;
		array[1][0] = 67;
		array[2][0] = 78;
		//遍历一班学生的成绩
		for(int i=0;i<array[0].length;i++) {
			System.out.println(array[0][i]);
		}
		//遍历所有学生的成绩
		for(int i=0;i<array.length;i++) {//外层表示行
			for(int j=0;j<array[i].length;j++) {//内层表示一行的每一列
				System.out.println(array[i][j]);
			}
		}
	}

}

  数组中的数组内存图如下

四.数组的排序

  这节排序主要是介绍冒泡排序。冒泡排序简单来说就是进行多轮比较,通过多轮比较将原数组进行排列,从大到小或者从小到大都行。如从小到大,第一轮找到数组的最大值放在数组的最后一位固定不动,比较次数是总元素-1。第二轮比较是将剩余的所有元素进行排序,再找到一个最大值,放在倒数第二位固定不动,比较次数为总元素-2,以此类推。可以总结一下,比较的轮数是总元素数-1,每一轮比较次数是总元素数-轮数。下图为冒泡排序示意图。

  代码如下:

/*
 * 冒泡排序
 */
public class ArrayDemo4 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] array = {12,34,11,24,56};
		for(int i = 1;i<array.length;i++) {//比较轮数
			for(int j = 0;j<array.length-i;j++) {
				//每一轮比较的次数
				//从小到大
				if(array[j]>array[j+1]) {
					int t = array[j+1];
					array[j+1] = array[j];
					array[j] = t;
				}
			}
		}
		
		for(int i = 0;i<array.length;i++) {
			System.out.println(array[i]);
		}
	}

}

五.数组的最大、最小、过滤重复

  现在给你一个数组,那如何找到数组的最大值、最小值以及去除数组中的重复元素呢?现在我们一个一个来介绍

  先介绍如何找最大值,思路就是先创建一个最大值变量,然后假设第一个元素就是最大值,之后用它和后面的元素进行比较,如果有比他大的,就把该元素存储到最大值变量中,代码如下:

  

/*
 * 找最大值
 */
public class ArrayDemo5 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] array = {12,3,34,56,78};
		int max = array[0];
		for(int i=0;i<array.length-1;i++) {
			if(array[i]<array[i+1]) {
				max = array[i+1];
			}
		}
		System.out.println(max);
	}

}

  接下来介绍如何找最小值,和找最大值一样,直接上代码:

/*
 * 找最小值
 */
public class ArrayDemo6 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] array = {12,3,34,56,78};
		int min = array[0];
		for(int i=0;i<array.length-1;i++) {
			if(array[i]>array[i+1]) {
				min = array[i+1];
			}
		}
		System.out.println(min);
	}

}

  最后讲一下如何去除数组中的重复数据。这个过程是这样的,要个每个元素一个标记,boolean类型的标记,然后将每个袁旭和其他元素相比较,如果重复,那就将其标记改变,最后将没有改变标记的元素放入一个新的数组,并统计个数。最终将新的数组复制到另一个数组中。

  这里额外提一个方法,复制数组的方法,System.arraycopy()

  public static void arraycopy(Object src,int srcPos,Object dest,int destPos,int length)

  • src:原始数组
  • srcPos:原始数组起始位置
  • dest:目标数组
  • destPos:目标数组起始位置
  • length:要复制的数组元素的数量

  代码如下:

/*
 * 过滤重复
 */
public class ArrayDemo7 {
	public static void main(String[] args) {
		int[] array = {12,12,34,56,56,78};
		int[] array1 = new int[array.length];
		int t = 0;//新的数组个数
		for(int i = 0;i<array.length;i++) {//外层循环先确定第几个元素开始比较
			boolean flag = true;
			for(int j=i+1;j<array.length;j++) {//内层循环开始比较
				if(array[i]==array[j]) {//发现重复就改变flag,跳出循环
					flag = false;
					break;//有一个重复之后就不用比了
				}
			}
			if(flag==true) {//判断标记是否被改变,没被改变就放入新的数组
				array1[t] = array[i];
				t++;
			}
		}
		for(int i = 0;i<array1.length;i++) {
			System.out.println(array1[i]);
		}//这样输出会有0,不想要0
		
		int[] newArray = new int[t];
		System.arraycopy(array1, 0, newArray, 0, t);//复制数组
		for(int i = 0;i<newArray.length;i++) {
			System.out.println(newArray[i]);
		}
	}
}

六.数组的系统类Arrays

  

方法名 说明
public static void toString(int[] a) 可返回指定数组的内容的字符串表示形式
public static void sort(int[] a) 按照数组从小到大排序,可以不用冒泡排序了
public static long[] copyOf(long[] original,int newLength) 复制指定数组,original:要复制的数组  newLength:新数组的长度

  这些方法都是Arrays类的静态方法,要调用的话就是类名.方法名就行了

  代码示例如下:

import java.util.Arrays;

public class ArrayDemo8 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] array = {12,3,4,1,56};
		System.out.println(Arrays.toString(array));
		
		//排序
		Arrays.sort(array);
		System.out.println(Arrays.toString(array));//从小到大排序,省略了冒牌排序
		
		int[] newTemp = Arrays.copyOf(array, 6);//复制数组
		newTemp[5] = 10;//给最后一个元素复制
		System.out.println(Arrays.toString(newTemp));
		
		array = Arrays.copyOf(array, 6);//这个方法有扩容的作用,要不然创建一个数组就无法改变它的长度了
		array[5] = 111;
		System.out.println(Arrays.toString(array));
		
		
	}

}

七.总结

  数组这一章就总结好了,这一章学完后我掌握了数组的创建和遍历方法、数组中的数组、冒泡排序、找到数组最大最小值、过滤重复值以及数组类方法等等。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。