本来应该继续写线程的总结,但是今天学了数组这一章,觉得很简单,就先把这章总结了吧,明天继续总结线程。数组这章课主要讲解了数组的定义、数组中的数组用法以及数组类常见方法。
一、数组的定义和作用
为什么需要数组呢,设想一下,如果我们需要给一个班级的每一个学生都录入成绩,正常来说就可以给每个学生创建变量,然后给他们赋值就行,但是这样做是不是很麻烦呀,需要创建好几十个变量,所以我们想简单的处理一下,就这样我们有了数组。
数组是一种数据类型,存储相同数据类型的一组数据。当我们声明一个变量时,就是在内存空间中开辟一块空间,而声明数组时,就是在内存中开辟一串连续的空间。
数据基本的概念上面已经说的差不多了,现在讲讲如何定义数组。定义数组有两种方式,分别是动态初始化和静态初始化。
动态初始化:初始化时只指明数组长度,初始值有系统分配。定义方法为:数据类型[] 数组名 = 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 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 System.out.println(array[0][i]); } //遍历所有学生的成绩 for(int i=0;i for(int j=0;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 for(int j = 0;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 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 if(array[i] 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 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 boolean flag = true; for(int j=i+1;j if(array[i]==array[j]) {//发现重复就改变flag,跳出循环 flag = false; break;//有一个重复之后就不用比了 } } if(flag==true) {//判断标记是否被改变,没被改变就放入新的数组 array1[t] = array[i]; t++; } } for(int i = 0;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 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)); } } 七.总结 数组这一章就总结好了,这一章学完后我掌握了数组的创建和遍历方法、数组中的数组、冒泡排序、找到数组最大最小值、过滤重复值以及数组类方法等等。