数组介绍
数组(array)是一种r容器,用来存储同种数据类型的多个值。
总结: 数组容器在存储数据的时候,需要结合数据类型考虑。
例如:int类型的数组容器(boolean byte short double)
建议:容器的类型,和存储的数据类型保持一致
数组容器的使用场景
需求:统计两个班级学生的平均分
一班: 100 90 80
二班: 11 22 33 6个数据,6个变量存储,100个数据呢?
总结:如果今后要操作的数据,是同一组数据容器进行存储
以上定义数组格式,第一种较为常见
- 以下为例,代码仅供参考:
package array;
/*
数组的定义的格式:
1.数据类型[] 数组名;
2.数据类型 数组名[];
*/
public class code01 {
public static void main(String[] args) {
//数据类型[] 数组名;
//定义了一个int类型的数组,数组名叫arr
/*
这里虽然是定义了一个数组,但也仅仅只是一个数组类型的[变量],变量没有进行初始化,就直接使用,这就是错误原因。
*/
int[] arr;
System.out.println(arr);
//定义了一个charr类型的数组,数组名叫aArr
char[] cArr;
System.out.println(cArr);
int a = 10;
System.out.println(a);
}
}
数组初始化值动态初始化
- 数组初始化概述
- java中的数组必须先初始化,然后才能使用
- 所谓初始化:就是在内存中,为数组容器开辟空间,并将数据存入容器中的过程
- 动态初始化
- 动态初始化:初始化时只指定数组长度,由系统为数组分配初始值
- 格式:数据类型:数据类型[]变量名 = new 数据类型[数据长度];
- 范例: int [] arr = new int[3]
package array;
public class code02 {
/*
数组的动态初始化:
在初始化的时候,需要手动指定数组的长度,系统会数组容器分配初始值.
动态初始化格式:
数据类型[] 数组名 = new 数据类型[数组的长度];
注意:
[I@1b6d3586
@ : 分隔符
[ : 当前的空间是一个数组类型
I : 当前数组容器中所存储的数据类型
1b6d3586:十六进制内存地址
*/
public static void main(String[] args) {
//数据类型[] 数据名 = new 数据类型[数组的长度];
//通过new关键字创建了一个int类型的数组容器,该容器可以存储5个int类型的整数,该容器被arr数组变量所记录
int[] arr = new int[5];
//[I@1b6d3586
System.out.println(arr);
byte[] bArr = new byte[3];
//[B@4554617c
System.out.println(bArr);
}
}
注意:打印数组变量名,出现的是数组在内存中的地址值
例如:[I@10f87f48
数组元素访问
-
数组变量访问方式
-
格式:数组名
-
数组内部保存的数据的访问方式
-
格式:数组名[索引]
作用:访问数组容器中的空间位置
索引是数组容器中空间的编号
特征1:索引从0开始
特征2:索引是连续的
特征3:索引逐一增加,每次加1
- 索引是数组中空间的编号
- 特征1:索引从0开始
- 特征2:索引是连续的
- 特征3:索引逐一增加,每次加1
作用:访问数组容器中的空间位置
package array;
public class code03 {
/*
数组动态初始化:
初始化的时候,手动指定数组长度,系统会为数组容器分配初始值.
数组的元素访问格式:
数组名[索引]
索引:数组中数据的编号方式,编号从0开始
作用:访问数组容器中的空间位置
注意:
数组在创建完毕后,即使没有赋值,也可以取出,但取出的元素都是默认初始化值.
*/
public static void main(String[] args) {
int[] arr = new int[3]; //0 1 2
System.out.println(arr); //数组的内容地址 [I@1b6d3586
//数组名[索引] 访问数据库容器中的空间位置
System.out.println(arr[0]); //0 系统默认分配的默认初始化值
System.out.println(arr[1]);
System.out.println(arr[2]);
System.out.println("--------------------");
//数组名[索引]
arr[0] = 11;
arr[1] = 22;
arr[2] = 33;
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
}
}
java中内存分配
java程序在运行时,需要在内存中分配空间
为了提高运算效率,就对空间进行了不同区域的划分
每一片区域都有特定的处理数据方式和内存管理方式
数组内存图(多个数组指向相同)
因为之后的数组没有new所以在堆内存中创建不了进程,就把之前001的堆内存给覆盖了
当两个数组,有一个数组执行后,那么另一个数组看到的就是操作后的现象。
数组的静态初始化
静态初始化: 初始化时,就可以指定数组要存储的元素,系统还会自动运算出该数组长度
-
格式: 数据类型[] 变量名 = new 数据类型[] {数据1,数据2,数据3, …}
-
范例: int [] arr = new int [] {1,2,3}
-
简化格式: 数据类型[ ] 变量名 = {数据1,数据2,数据3,…};
-
范例 : int [ ] arr = {1 , 2 , 3};4
package array2;
public class code05 {
/*
数组静态初始化: 初始化时指定每个数组元素的初始值,由系统决定数组长度
完整格式:
数据类型[] 数组名
简化格式:
数据类型[] 数组名
*/
public static void main(String[] args) {
// 数据类型[] 数组名 = new 数据类型[]{数据1,数据2,数据3...};
int[] arr = new int[]{11,22,33};
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
// 数据类型[] 数组名 = {数据1,数据2,数据3...};
int[] arr2 = {44,55,66};
System.out.println(arr2);
System.out.println(arr2[0]);
System.out.println(arr2[1]);
System.out.println(arr2[2]);
}
}
两种初始化的区别对比
- 动态初始化: 手动指定数组长度,由系统给出默认初始值。
- 静态初始化: 手动指定数组元素,系统会根据元素个数,计算出数组的长度
使用场景
动态初始化: 只明确元素个数,不明确具体数值,推荐使用动态初始化
例:使用数组容器来存储键盘录入的5个整数
int[] arr = {?????};
int{} arr = new int[5];
- 静态初始化: 需求中已经明确了要操作的具体数据,直接静态初始化即可
例: 将一班的学生成绩存入数组中 11,22,33
int[] arr = {11,22,33}
- 空指针异常 : 访问的数组已经不再指向堆内存的数据,造成空指针异常
- null : 空值,引用数据类型的默认值,表示不指向任何有效对象