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