对于所有的编程语言来说数组都是相对比较重要的数据结构之一。在Java中数组主要用来存放一组固定大小的相同类型的数据。
数组容器在存储数据的时候,需要结合数据类型考虑。
例如:int类型的数组容器(boolean 、byte、short、double)
定义数组格式:
1、数据类型【】 变量名
例:int[ ] array
2、数据类型 变量名【】
例:int array[ ]
初始化
动态初始化:初始化时只指定数组长度,由系统为数组分配初始值。
格式:数据类型【】变量名=new 数据类型【数组长度】;
例:int[ ] arr =new int [3];
说明:通过new关键字创建了一个int类型的数组容器,该容器可以存储3个int类型的整数,该容器被arr数组变量所记录。
注意:打印数组变量名的时候,会打印出数组的内存地址。
内存地址:
例:[I@1b6d3586
@:分隔符
[:当前的空间是一个数组类型
I:当前数组容器中所存储的数据类型
1b6d3586:十六进制内存地址
数组元素访问
数组内存地址的访问方式
格式:数组名
数组内部保存的数据的访问方式
格式:数组名【索引】
索引是数组容器中空间的编号
特征:
索引从0开始
索引是连续的
索引 一增加,每次加1
索引:数组中数据的编号方式,编号从0开始
作用:访问数组容器中的空间位置
注意:数组在创建完后,即使没有赋值,也可以取出,但取出的元素都是默认初始值。
各数据类型的默认初始值:
数据类型 |
默认值 |
整数 |
0 |
浮点数 |
0.0 |
布尔 |
false |
字符 |
空字符 |
引用数据类型 |
null |
引用数据类型:引用、记录了地址值的变量,所对应的数据类型,就是引用数据类型
例:int [ ]=new int[ 3];
内存分配
栈内存:方法运行时,进入的内存,局部变量都存放于这块内存当中
堆内存:new出来的内容都会进入堆内存,并且会存在地址值。
方法区:字节码文件(.class文件)加载时进入的内存
本地方法栈:调用操作系统相关资源
寄存器:交给CPU去使用
多个数组的内存
每new一次,在堆内存中,都是一块新的空间,堆内存中的空间地址不会出现重复的现象。
数组静态初始化:初始化时指定每个数组元素的初始值,由系统决定数组长度。
完整格式:数据类型【】 数组名=new 数据类型【】 {数据1、数据2、……};
简化格式:数据类型【】 数组名={数据1数据2、……};
使用场景
动态初始化:只明确元素个数,不明确具体数值,推荐使用动态初始化。
例:使用数组容器来存储5个整数。
int[] arr=new int[5];
静态初始化:需求中已经明确了要操作的具体数据,直接静态初始化即可
例:在数组中 存入66,77,88
int[] arr={66,77,88};
数组操作的两个常见小问题
索引越界:访问了数组中不存在的索引,造成索引越界问题
空指针异常:访问的数组已经不再指向堆内存的数据,造成空指针异常。
数组的遍历
使用for循环遍历
数组遍历:将数组中所有的数据取出来。
例:int[] arr= {11,22,33,44,55};
for(int i=0;i<arr.length;i++){
arr[i];
}
动态获取数组元素个数:数组名 . Length
注:遍历指的是取出数据的过程,不要局限的理解为遍历就是打印!
获取最小值:
步骤:
while循环遍历
例:int[] intArr3=new int[]{41,52,56,58,60};
int index=0;
while (index<intArr3.length){
System.out.print(intArr3[index]+"\t");
index++;//一定要用,不然会出现死循环
}
加强for循环遍历(只能取值,不能赋值)
例:int[] intArr3=new int[]{41,52,56,58,60};
for(int j:intArr3){
System.out.print(j+"\t");
}