This article brings you relevant knowledge about java, which mainly introduces issues related to arrays, including the definition of arrays, attributes of arrays, memory maps, and some common ones. Let’s take a look at the problem below. I hope it will be helpful to everyone.
Recommended study: "java video tutorial"
Definition of array
1. Overview
- If the grades of a classmate need to be stored, what method should be used?
- As we learned before, multiple variables can be defined to store different grades. But if there are more than 1,000 students, then how about defining more than 1,000 variables? Of course not, this requires using our array.
2. Static initialization of array
General format:
数据类型[] 数组名 = { 元素1,元素2 ,元素3,… };
例如:
int [] array= {1,2,3,4,5};
double[] scores = {88.5, 99.5, 59.5};
3. Dynamically initialize the array
General format:
数据类型[] 数组名 = new 数据类型[长度];
例如:
int [] array= new int[5];
double[] scores = new double[3];
Default value:
Data type |
Specific definition type |
Default value |
Basic type |
byte, short, char, int, long |
0 |
##float, double
| 0.0 |
boolean
| false |
Reference type |
Class, Interface, Array, String
| null |
4.总结
- 数组适合同种类型的大量数据
-
静态初始化适合知道了元素值
-
动态初始化适合不清楚存入哪些数据
数组的属性
1.访问
数组名称[索引]
例题:
//静态初始化数组
int [] array= {1,2,3,4,5};
System.out.println(array[0]);//输出 1
System.out.println(array[1]);//输出 2
System.out.println(array[3]);//输出 4
2.长度
例题:
//静态初始化数组
int [] array= {1,2,3,4,5};
System.out.println(array.length);//调用方法,输出长度 5
//最大索引array.length-1
3.遍历
- 遍历就是一个一个数组元素的访问,主要应用在搜索、数据统计......
- 我们之前学了第7天:循环结构、第6天:分支结构,下面通过for循环遍历一个数组
例题:
- 给定元素 {10,8,9,4,5,6,8,71,2,3,9,99},用静态数组存储并输出数组中大于5的元素?
编码实现:
//静态初始化数组
int [] array= {10,8,9,4,5,6,8,71,2,3,9,99};
for(int i=0;i<array.length;i++)
{
if(array[i]>5)
System.out.println(array[i]);
}
输出结果:
10 8 9 6 8 71 9 99
内存图
- Java在程序运行时,需要在内存中分配空间,对空间进行了不同区域的划分。
-
栈内存:存储局部变量,使用完毕立即消失
-
堆内存:存储new 出来的内容(对象、实体),地址使用完毕在垃圾回收器空闲时回收
1.单数组内存图
编码实现:
//动态初始化数组
int [] arr=new int[3];
System.out.println(arr);
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
//修改值
arr[0]=100;
arr[2]=200;
System.out.println(arr);
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
输出结果:
[I@15db9742
0
0
0
[I@15db9742
100
0
200
原理讲解:
- 动态初始化先在堆内存生成一个new 一个arr 地址值,具体看编译器的结果,这里假设001。由于动态初始化,所以每个元素都有一个初始值,具体可以看上面的表。我们输出元素,先访问数组名地址,到堆内存下标,再输出元素值。
- 修改数组值,历程和查看相同,只不过多了一步修改的过程,如下图:
2.多数组内存图
- 多个数组和单数组内存使用原理相同,这里我就不过多讲述了。
3.数组指向相同内存
- 假如我们把两个数组的地址值改为相同,修改后的结果该是如何,如下面的代码。
编码实现:
//动态初始化数组
int [] arr=new int[3];
arr[0]=100;
arr[1]=200;
arr[2]=300;
System.out.println(arr);
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
int [] arr2=arr;
arr2[0]=111;
arr2[1]=222;
arr2[2]=333;
System.out.println(arr);
System.out.println(arr[0]);
System.out.println(arr2);
System.out.println(arr2[0]);
输出结果:
[I@15db9742
100
200
300
[I@15db9742
111
[I@15db9742
111
原理讲解:
- 第一个数组在堆内存的地址为001,第二个数组也为001,所以修改第二个数组的值,其实都是同一个数组内存。第一个数组的值也会随着改变,结果如下:
常见问题
1.索引越界
//静态初始化数组
int [] array= {1,2,3};
System.out.println(array[3]);
- 上面的代码运行之后,会出现下面的报错异常:
- Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
-
解释:我们静态化初始数组给了3个数字,最大索引为2,当我们访问3时,就会报错
2.空指针异常
//动态初始化数组
int [] array= new int[3];
array=null;
System.out.println(array[0]);
- 上面的代码运行之后,会出现下面的报错异常:
- Exception in thread "main" java.lang.NullPointerException
-
解释:我们将数组置为null,导致访问的数组不指向堆内存的数据
推荐学习:《java视频教程》
The above is the detailed content of Java array knowledge points (summary sharing). For more information, please follow other related articles on the PHP Chinese website!