Java 语言中提供的数组是用来存储固定大小的同类型元素。即存储同种数据类型的多个值
1.声明数组变量和数组初始化
首先必须声明数组变量,才能在程序中使用数组。
语法:
dataType[] arrayRefVar;
或
dataType arrayRefVar[];
Java中的数组必须先初始化,然后才能使用
初始化数组有两种:静态初始化和动态初始化
动态初始化: 初始化时指定数组长度,由系统为数组分配初始值
格式:
数据类型[ ] 变量名= new 数据类型[数组长度];
范例:
int [ ] arr = new int[5];
静态初始化:初始化时,就可以指定要存储的元素,系统还会计算出该数组的长度
格式:
数据类型[ ] 变量名= {数据1,数据2,数据3.....};
范例:
int [ ] arr = {1,2,3,4,5,6};
动态初始化和静态初始化的区别:
- 动态初始化:手动指定数组长度,由系统给出默认初始值。
- 静态初始值:手动指定数组元素,系统会根据元素个数,计算数组的长度。
2.操作数组的元素
数组元素访问
访问方式 格式:数据名[索引]
索引的作用:访问数组容器中的空间位置
索引是数组容器中空间的编号
特征:
-
索引从0开始
-
索引是连续的
-
索引逐一增加,每次加一
public class Text1 {
public static void main(String[] args) {
int d[]={4,5,6,2,3,1,9,8,7,10,12,14,15};//下标从0开始
System.out.println(d[0]);//输出下标为0的值 为4
System.out.println(d[1]);//输出下标为1的值 为5
}
}
3.内存分配
Java 程序在运行时,需要在内存中分配空间。
为了提高运算效率,就对空间进行了不同区域的划分
每一片区域都有特定的处理数据方式和内存管理方式。
-
栈内存:方法运行时,进入的内存,局部变量都存放于这块内存当中
-
堆内存:new出来的内容都会进入堆内存,并且会存在地址值
-
方法区:字节码文件(.class文件)加载时进入的内存
-
本地方法栈:调用操作系统相关资源
-
寄存器:交给CPU去使用
数组操作常见的问题
- 索引越界:访问了数组中不存在的索引对应的元素,造成索引越界问题
- 空指针异常:访问的数组已经不再指向堆内存的数据,造成空指针异常
- null:空值,引用数据类型的默认值,表示不指向任何有效对象
索引越界:
int d[]={4,5,6,2,3,1,9,8,7,10,12,14,15};//下标从0开始
System.out.println(d[20]);//输出下标为20的值
因为数组中没有下标为20的值,导致索引越界报错
空指针异常
int d[]={4,5,6,2,3,1,9,8,7,10,12,14,15};//下标从0开始
d=null;
System.out.println(d[2]);//输出下标为2的值,
第二行代码d=null将d数组的值赋为空值,所以后面的索引就报错
4.数组遍历
扩展:
For-Each 循环
For-Each 能在不使用下标的情况下遍历数组。
语法:
for(type element: array)
{
System.out.println(element);
}
用法实例:
public class Text1 {
public static void main(String[] args) {
int a[] = {12,36,45,97,52};
// 打印所有数组元素
for (int element: a) {
System.out.println(element);
}
}
}
运行结果: