1.数组:
1.1:数组介绍:
1)数组就是用来存储一组相同类型数据的数据结构(容器)。
2)数组本身属于引用类型
3)数组中的元素可以是基本数据类型也可以是引用数据类型
4)Java中支持多维数组,多维数组中的元素都是数组
1.2:数组的定义格式:
1.2.1 第一种格式:
数组类型 [ ] 数组名
示例:
int [ ] arr;
double [ ] arr;
char [ ] arr;
1.2.2 第二种格式:
数组类型 数组名 [ ]
示例:
int arr [ ];
double arr [ ];
char arr [ ];
解释:在定义数组时,所指定的数据类型,是用来表示数组中元素的数据类型。
1.3:数组的动态初始化:
1.3.1 什么是动态初始化
数组动态初始化就是只给定数组的长度,由系统给出默认初始化值。
1.3.2 动态初始化格式
数据类型 [] 数组名 = new 数据类型 [ 数组长度 ];
int [ ] arr = new int [ 3 ];
1.3.3 动态初始化格式详解
1)等号左边:
int:数组的数据类型
[ ]:代表这是一个数组
arr:代表数组的名称
2)等号右边:
new:为数组开辟内存空间
int:数组的数据类型
[ ]:代表这是一个数组
5:代表数组的长度
1.4 数组元素访问
1.4.1 什么是索引(下标)
1) 每一个存储到数组的元素,都会自动的拥有一个编号,从0开始。
2)这个自动编号称为数组索引(index),可以通过数组的索引访问到数组中的元素。
3) 数组中索引的最大值,就是数组的长度-1。
4)数组可以通过 数组名 .length 获取数组的长度。
1.4.2访问数组元素格式
数组名 [ 索引 ];
1.5 内存分配
1.5.1 内存概述
内存是计算机中的重要原件,临时存储区域,作用是运行程序。
我们编写的程序是存放在硬盘中的,在硬盘中的程序是不会运行的。
必须放进内存中才能运行,运行完毕后会清空内存。
Java虚拟机要运行程序,必须要对内存进行空间的分配和管理
1.5.2 java 中的内存分配
目前我们只需要记住两个内存,分别是:栈内存和堆内存
局部变量指的是在方法内部或者语句块内定义的变量。
内存的运行:
程序在执行时,首先把字节码文件加载到方法区,main 方法会被 jvm自动调用,此时就会进入main 方 法的栈内存,如果在 main 方法中声明并创建了一个数组对象,则数组声明的对象位于栈内存中,而当前 数组实际存放数据位于堆内存中,堆内存会产生一个地址,并且把该地址赋值给数组名,所以数组名实 际上是对堆内存地址的引用。
注意:引用类型,对象位于栈内存,对象存储的数据都会位于堆内存。
1.6 数组的静态初始化
1.6.1 什么是静态初始化
在创建数组时,直接将元素确定。
1.6.2 静态初始化格式
1) 完整版格式
数据类型 [ ] 数组名 = new 数据类型 []{ 元素 1 , 元素 2 ,...};
2) 简化版格式
数据类型 [ ] 数组名 = { 元素 1 , 元素 2 ,...};
1.7 数组操作的两个常见问题
1.7.1 索引越界异常
1) 出现原因
数组长度为3,索引范围是 0~2 ,但是我们却访问了一个 3 的索引。
程序运行后,将会抛出ArrayIndexOutOfBoundsException 数组越界异常。在开发中,数组的越界异常是不能出现的,一旦出现了,就必须要修改我们编写的代码。
2) 解决方案
将错误的索引修改为正确的索引范围即可!
1.7.2 空指针异常
1)出现原因
arr = null 这行代码,意味着变量arr 将不会在保存数组的内存地址,也就不允许再操作数组了,因此运行的时候会抛出 NullPointerException 空指针异常。在开发中,空指针异常是不能出现的,一旦出现了,就必须要修改我们编写的代码。
2)解决方案
给数组一个真正的堆内存空间引用即可!
1.8 数组遍历
数组遍历:就是将数组中的每个元素分别获取出来,就是遍历。遍历也是数组操作中的基石。
以上代码是可以将数组中每个元素全部遍历出来,但是如果数组元素非常多,这种写法肯定不行,因此我们需要改造成循环的写法。数组的索引是 0 到 lenght-1 ,可以作为循环的条件出现。
1.9 多维数组
1)Java中其实并没有真正的多维数组,但是 Java 支持把一维数组可以作为其它数组的元素,这样就形成了多维数组
2)Java中只有一维数组
3)多维数组可以通过[ ] 来表示,一个 [ ] 表示一维数组,几个中括号就表示几维数组
1.9.1 二维数组
动态初始化语法格式:
静态初始化语法格式:
注意:多维数组在进行迭代输出时,数组的维数和使用的循环的嵌套数是一一匹配的。例如:三维数组,就要使用三重for 循环才能把数据迭代输出。
----------------------------------------------------------------------------------------
/**
多维数组
*/
public class Demo5 {
public static void main ( String [ ] args ){
// 二维数组,静态初始化
int [ ][ ] arr1 = {{ 10 , 20 , 30 },{ 40 , 50 , 60 },{ 7 , 8 , 9 }};
int [ ][ ] arr4 = new int [ ][ ]{{ 1 , 2 , 3 },{ 4 , 5 , 6 },{ 7 , 8 , 9 }};
// 二维数组的长度,其实就是一维数组的个数
System . out . println ( arr1 . length );
// 迭代数据
for ( int i = 0 ; i < arr1 . length ; i ++ ){
for ( int j = 0 ; j < arr1 [ i ]. length ; j ++ ){
System . out . println ( arr1 [ i ][ j ]);
}
}
// 动态初始化 , 二维数组的长度必须要指定
char [ ][ ] arr2 = new char [ 3 ][ ];
// 初始化 , 必须创建一维数组
arr2 [ 0 ] = new char [ 2 ];
arr2 [ 0 ][ 0 ] = 'a' ;
arr2 [ 0 ][ 1 ] = 'b' ;
arr2 [ 1 ] = new char [ 3 ];
arr2 [ 1 ][ 0 ] = 'c' ;
arr2 [ 1 ][ 1 ] = 'd' ;
arr2 [ 1 ][ 2 ] = 'e' ;
arr2 [ 2 ] = new char [ 2 ];
arr2 [ 2 ][ 0 ] = 'f' ;
arr2 [ 2 ][ 1 ] = 'g' ;
System . out . println ( arr2 [ 0 ][ 0 ]);
System . out . println ( arr2 [ 0 ][ 1 ]);
System . out . println ( arr2 [ 1 ][ 0 ]);
System . out . println ( arr2 [ 1 ][ 1 ]);
System . out . println ( arr2 [ 1 ][ 2 ]);
System . out . println ( arr2 [ 2 ][ 0 ]);
System . out . println ( arr2 [ 2 ][ 1 ]);
int [ ][ ][ ] arr3 = {{{ 1 , 2 },{ 3 , 4 }},{{ 5 , 6 },{ 7 , 8 , 9 }}};
System . out . println ( arr3 . length );
int [ ][ ][ ] arr4 = new int [ 3 ][ ][ ];
arr4 [ 0 ] = new int [ 2 ][ ];
arr4 [ 0 ][ 0 ] = new int [ 3 ];
arr4 [ 0 ][ 0 ][ 0 ] = 10 ;
arr4 [ 0 ][ 0 ][ 1 ] = 20 ;
}
}
---------------------------------------------------------------------------------------
1.9.2 内存分析
解析:
上面图中所表示的,就相当于我们在堆中开辟了四个一维数组,其中一个一维数组用来存放二维数组的元素,然后由二维数组的元素各自指向一个一维数组,栈中定义了一个变量arr1,存放的是二维数组的内存地址。