数组学习
- 一 一维数组
- 1.1 数组介绍
- 1.2 多个变量和数组对比
- 1.3 数组的定义和初始化
- 1.3.1 数组定义
- 1.3.2 数组初始化
- 1.4 数组访问
- 二 数组内存结构
- 2.1 JVM内存介绍
- 2.1.1一个数组对象的内存图
- 2.1.2常见异常处理
- 三 数组常见操作
- 四 二维数组
- 4.1 二位数组介绍
- 4.2 二维数组定义和初始化
- 4.3 二维数组内存图
- 作业
一 一维数组
1.1 数组介绍
数组是引用数据类型,可以看做是一个容器,存储着多个相同类型变量。
数组中存储的每个数据被称为元素,每个元素可以看做是当前数组中一个个变量,变量类型取决于数组定义类型。
数组中存储数据类型可以是基本类型也可以是引用类型。
1.2 多个变量和数组对比
定义多个变量
int a = 11;
int b = 12;
int c = 13;
int d = 14;
int e = 15;
数组
int[] arr = {11,12,13,14,15};
1.3 数组的定义和初始化
1.3.1 数组定义
数组定义格式
数据类型[] 数组名;int[] arr; //常用
数据类型 数组名[];int arr[]; //不常用
1.3.2 数组初始化
初始化介绍
java中数组未初始化不能使用
初始化分类: 动态初始化、静态初始化
动态初始化介绍:先初始化数组对象,指定数组的大小。之后指定数组中要存储的数据元素。
初始化格式:
数据类型[] 数组名 = new 数据类型[数组长度];
示例:定义一个数组,指定数组长度
int[] array = new int[3];
array[0] = 11;
array[1] = 12;
array[2] = 13;
静态初始化介绍:初始化数组对象同时初始化数组中要存储的元素。
初始化格式一
数据类型[] 数组名 = new 数据类型[]{元素1,元素2,元素3,元素4};
初始化格式二
数据类型[] 数组名 = {元素1,元素2,元素3,元素4};
示例
int[] array = new int[]{10,20,30,40,50};
int[] array1 = {11,21,31,41,51};
1.4 数组访问
索引介绍
数组中有一个索引或叫角标、下标,数组创建以后会每一个元素进行自动编号从0开始。
获取数组中元素
数组名[索引];
int[] array = new int[]{10,20};
System.out.println(array[0]);
int value = array[0];
为数组中元素赋值
数组名字[索引] = 值;
array[0] = 80;
数组中的长度
数组中一个属性为length,返回当前数组的长度。
示例
int[] array = new int[]{10,20};
System.out.println("数组的长度是:"+array.length);
二 数组内存结构
2.1 JVM内存介绍
JVM在执行java程序过程中会将整个内存划分为多个不同的数据区域,每个区域都有自己的用途及特定数据处理方式和内存管理方式,从而更加高效利用内存。
各内存区域的用途
程序计数器(Program Counter Register)
与CPU相关,如字节码执行行号指示器。
虚拟机栈(VM Stack)
执行方法时会先去虚拟机栈区域申请栈空间,称为压栈或入栈,方法运行结束释放内存空间,称为弹栈或出栈。
本地方法栈(Native Method Stack)
本地方法栈和虚拟机栈一样,但是本地方法栈针对的是本地方法,C/C++编写的方法。
方法区(Method Area)
方法区存放着Class字节码、常量池、静态修饰的内容等。
堆(Heap)
堆在整个jvm内存中占用空间最大,对象都是存在堆内存中,比如new创建对象。堆内存中对象使用完成就变成了的垃圾由垃圾收集器回收释放内存空间。
1.程序计数器、虚拟机栈、本地方法栈是线程私有的。不需要实现垃圾收集,因为线程结束,内存
随之释放。
2.方法区、堆是线程共享的。是垃圾收集器主要收集的两个区域,程序运行过程中产生的垃圾对象
或废弃常量及废弃类等都会被垃圾收集器进行自动回收。
注意:
1.程序计数器、虚拟机栈、本地方法栈是线程私有的。不需要实现垃圾收集,因为线程结束,内存
随之释放。
2.方法区、堆是线程共享的。是垃圾收集器主要收集的两个区域,程序运行过程中产生的垃圾对象
或废弃常量及废弃类等都会被垃圾收集器进行自动回收。
2.1.1一个数组对象的内存图
代码
public class ArrayDemo01 {
public static void main(String[] args) {
int[] array = new int[3];
System.out.println(array);
System.out.println(array[0]);
System.out.println(array[1]);
System.out.println(array[2]);
System.out.println(array);
//出栈
//两个数组对象运行时内存图
//代码
array[0] = 10;
array[1] = 11;
array[2] = 12;
System.out.println(array[0]);
System.out.println(array[1]);
System.out.println(array[2]);
}
}
入栈
出栈
2.1.2常见异常处理
角标越界异常(ArrayIndexOutOfBoundsException)
因为数组角标是从0开始,不是从1开始。
案例演示:
int[] array = new int[5];
System.out.println(array[5]);//已经发生越界
解决方案:
数组属性 array.length获取数组长度;
数组长度减一就是数组的最大角标。
空指针异常(NullPointerException)
数组必须先初始化才能使用,只是声明数组变量无法使用。
案例演示:
int[] array; 或 int[] array = null;
System.out.println(array[0]);
解决方案:
//先判断数组变量是不是为null;
if(array != null ){
System.out.println(array[0]);
}
三 数组常见操作
数组元素遍历(for循环和while循环遍历数组)
//for循环遍历数组:
int[] array = new int[]{18,20,11,32};
for(int i=0; i <= array.length-1; i++){
System.out.println(array[i]);
}
//while循环遍历数组:
int[] array = new int[]{18,20,11,32};
int i = 0;
while(i <= array.length-1){
System.out.println(array[i]);
i++;
}
数组打印效果:[100 , 200 , 300 , 400 , 500]
封装代码如下:
public static void print(int[] array) {
System.out.print("[");
for(int i=0; i < array.length; i++) {
if(i != array.length-1) {
System.out.print(array[i]+" , ");
}else {
System.out.print(array[i]+"]");
}
}
}
获取数组中的最大值和最小值
public static void min(int[] array) {
//先获得数组中的第一个值,依次和数组中的每一个值进行比较
int min = array[0];
for(int i=1; i <= array.length-1;i++) {
if(array[i] < min) {
min = array[i];
}
}
System.out.println(min);
}
数组元素反转操作(数组中的元素对调)
代码实现:
int[] array = {200,300,400,500,600,700};
inversion(array);
方式一:
public static void inversion(int[] array) {
for(int start=0,end=array.length-1; start <= end; start++,end--) {
int temp = array[start];
array[start] = array[end];
array[end] = temp;
}
}
方式二:
public static void inversion(int[] array) {
for(int x=0; x<array.length/2; x++) {
int temp = array[x];
array[x] = array[array.length-1-x];
array[array.length-1-x] = temp;
}
}
数组元素查找(提供当月数值,判断属于哪个季度)
public static String season(int num) {
String[] seasonArray = {"春季","夏季","秋季","冬季"};
if(num >= 1 & num <= 3) {
return seasonArray[0];
}else if(num >= 4 & num <= 6) {
return seasonArray[1];
}else if(num >= 7 & num <= 9) {
return seasonArray[2];
}else if(num >= 9 & num <= 12) {
return seasonArray[3];
}
return null;
}
四 二维数组
4.1 二位数组介绍
二维数组可以理解为数组中还有数组
需求:有多个班级,每个班级有多个学生
一维数组存储每个班级的学生
二维数组存储每个班级
4.2 二维数组定义和初始化
格式一
数据类型[][] 变量名 = new 数据类型[m][n];
[m]中m表示二维数组中一维数组的数量
[n]中n表示每一个一维数组的元素个数
举例:
int[][] arr = new int[3][2];
定义了一个二维数组名字为arr
arr二维数组有3个一维数组,名称是arr[0],arr[1],arr[2]
每个一维数组有2个元素,可以通过arr[m][n]来获取
表示获取第m+1个一维数组的第n+1个元素
格式二
格式2
数据类型[][] 变量名 = new 数据类型[m][];
[m]中m表示二维数组中一维数组的数量
[]中为空,二维数组中每个一维数组中元素个数动态指定
举例:
int[][] arr = new int[3][];
arr[0] = new int[2];
arr[1] = new int[3];
arr[2] = new int[1];
格式三
格式3
数据类型[][] 变量名 = new 数据类型[][]{{元素…},{元素…},{元素…}};
简化版格式:
数据类型[][] 变量名 = {{元素…},{元素…},{元素…}};
举例:
int[][] arr = {{1,2,3},{4,6},{6}};
二维数组元素获取
int[][] array = new int[][] {{10,80,56},{90,11,82},{20,21,61}};
//输出第一个一维数组元素
System.out.println(array[0][0]);
System.out.println(array[0][1]);
System.out.println(array[0][2]);
//输出第二个一维数组元素
System.out.println(array[1][0]);
System.out.println(array[1][1]);
System.out.println(array[1][2]);
//输出第三个一维数组元素
System.out.println(array[2][0]);
System.out.println(array[2][1]);
System.out.println(array[2][2]);
二维数组遍历封装
public static void print(int[][] array) {
for(int i=0;i<array.length;i++) {
for(int j=0;j<array[i].length;j++) {
if(j != array[i].length-1) {
System.out.print(array[i][j]+",");
}else {
System.out.print(array[i][j]);
}
}
//换行操作
System.out.println();
}
}
4.3 二维数组内存图
二维数组练习
/*
需求:公司年销售额求和
某公司按照季度和月份统计的数据如下:单位(万元)
第一季度:22,66,44
第二季度:77,33,88
第三季度:25,45,65
第四季度:11,66,99
*/
// 定义二维数组
int[][] arr = {{22,66,44} , {77,33,88} , {25,45,65} , {11,66,99}} ;
// 定义一个累加变量
int sum = 0 ;
// 遍历数组
for(int x = 0 ; x < arr.length ; x++){
for(int y = 0 ; y < arr[x].length ; y++){
sum += arr[x][y] ;
}
}
// 输出
System.out.println("sum: " + sum) ;
}
练手题:
二维数组案例1:共有六个学生,将每个学生对应学生的语文、数学、英语成绩求和求平均值
作业
1.说说对数组的理解?
2.数组定义方式?
3.数组的初始化方式有几种?请写出详细案例
4.数组中角标有什么作用?
5.数组中如何避免角标越界?
6.数组中如何避免空指针异常?
7.JVM内存结构,分别有什么作用?
8.请写出一个简单的数组在内存中执行过程?
9.请画出数组内存图
10.请写出数组反转的实现多种方式,并说明思路
11.请写出一个代码对数组中的元素进行去重。
12.什么是二维数组?二维数组有什么作用?
13.二维数组的初始化方式有哪几种?
14.二维数组的中的内容如何输出?
15.二维数组的内存图?请写出执行步骤
16.自己找一个二维数组的应用场景,并写出代码实现。
微信公众号也会持续更新…
大家可以一起学习😊
.