java数组学习
结论:数组是相同类型数据的有序集合。(相同类型的若干个数据,按照一定的先后次序排列组合而成)其中,每一个数据称作一个数组元素,每个数组元素可以通过一个下标(数组的下标是从0开始索引)来访问他们。数组有边界,数组的长度为array.length。数组检索的范围是0-array.length-1。如果超过这个边界,就会报错数组下标越界ArrayIndexOutOfBounds。
Java 中的数组是一种用于存储固定大小的同类型元素的容器。数组在声明时就已经确定了其大小,并且在生命周期内无法改变。Java 数组可以是基本数据类型的数组,也可以是对象类型的数组。
数组的基本特点
数组的长度是确定的,数值一旦被创建,他的大小就是不可以改变的。
数组的元素必须是相同类型,不允许出现混合类型。(int类型的数组中不能出现除int类型以外的数据类型。)
数组的元素可以是任何数据类型,包括基本类型和引用类型。
数组变量属于引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量。
数组本身就是对象,Java中对象是在堆中。因此数组无论保存原始类型还是其他对象类型,都保存在堆中
数组的声明创建初始化
数组的声明
数组的声明指的是在代码中首次引入一个数组变量,但此时并不分配内存空间给数组。声明只是告诉编译器这个变量将会引用一个数组对象。数组的声明可以包括数组的类型和数组的名字。
数组的创建
数组的创建指的是为数组分配内存空间,并可能初始化数组的元素。数组的创建通常使用new
关键字,并指定数组的长度或直接在花括号中提供初始化值。
package com.jianstudy.array;
public class ArrayDemo01 {
public static void main(String[] args) {
//数组的数据类型 数组名 = new 数组类型[数组长度]; dateType[] name = new dateType[arraySize];
//声明创建一个数组nums,数组有5个元素。数组下标就是0-4。
//数组的所有数据只能是一种类型的 要么是数字要么是字符串不能同时出现两种数据类型
//数组声明的两种形式 int[] name , int name[] 两种都可以首选前者
int[] nums = new int[5];
//数组元素初始化赋值 数组有5(array.length)个元素。数组下标就是0-4(0-array.length-1)。
//如果索引时超过了数组的个数就会报错 数组下标越界(ArrayIndexOutOfBounds)
nums[0]=1;
nums[1]=5;
nums[2]=3;
nums[3]=2;
nums[4]=6;
//nums[4]="ijian";报错需要的是int类型提供的是String类型
System.out.println("第0号元素的值"+nums[0]);
System.out.println("第1号元素的值"+nums[1]);
System.out.println("第2号元素的值"+nums[2]);
System.out.println("第3号元素的值"+nums[3]);
System.out.println("第4号元素的值"+nums[4]);
//System.out.println("第4号元素的值"+nums[5]);nums数组只有5个元素,nums[5]已经超过了数组的大小会报错数组下标越界 ArrayIndexOutOfBoundsException
//获取数组长度(遍历数组)数组名.length array.length
System.out.println("这个数组的长度:"+nums.length+"个元素");
}
}
数组的初始化
在Java编程语言中,数组的初始化是一个为数组元素分配初始值的过程。初始化可以在数组声明时直接进行,也可以在数组声明之后的某个时刻通过赋值来完成。
- 静态初始化
静态初始化指的是在数组声明的同时就为其分配初始值。这种方式通常用于我们知道数组的具体内容和大小的情况。
- 动态初始化
动态初始化则是指先声明数组,然后在程序的后续某个时刻为其分配内存空间和初始值。这种方式在数组的大小或内容在程序运行时才能确定时非常有用。
- 隐性初始化
当数组通过 动态初始化 方式声明时(即仅指定长度,不直接赋值),JVM会自动为数组元素分配默认值。这种自动赋值的机制称为“隐性初始化”。隐性初始化仅作用于数组元素,数组变量本身仍需通过 new
分配内存
隐性初始化的默认值由数组元素的数据类型决定:
数据类型 | 默认值 |
---|---|
整型(int /long 等) |
0 |
浮点型(float /double ) |
0.0 |
boolean |
false |
引用类型(如String ) |
null |
静态/动态初始化核心区别在于:
- 静态初始化:声明时直接赋值,编译器自动推导长度。
- 动态初始化:声明时仅指定长度,由JVM分配内存并赋默认值。
package com.jianstudy.array;
public class ArrayDemo02 {
public static void main(String[] args) {
//数组静态初始化 直接在声明数组时给数组赋值
int[] A = {1,2,3,4,5};
System.out.println("A[0]元素"+A[0]);
System.out.println("A[1]元素"+A[1]);
System.out.println("A[2]元素"+A[2]);
System.out.println("A[3]元素"+A[3]);
System.out.println("A[4]元素"+A[4]);
//数组动态初始化
int[] B = new int[5];
B[0] = 5;
B[1] = 4;
B[2] = 3;
B[3] = 2;
B[4] = 1;
System.out.println("B[0]元素"+B[0]);
System.out.println("B[1]元素"+B[1]);
System.out.println("B[2]元素"+B[2]);
System.out.println("B[3]元素"+B[3]);
System.out.println("B[4]元素"+B[4]);
/*
数组的隐性默认初始化。
数组是引用类型,他的元素相当于类的实例变量,因此数组一经分配空间,其中的每个元素也被按照实例变量同样的方式被隐性初始化。
如果不给2,3,4号元素赋值,那2,3,4号元素输出的结果就是这个数据类型的默认值int类型是0,String类型是null
*/
int[] C = new int[5];
C[0] = 5;
C[1] = 4;
System.out.println("C[0]元素"+C[0]);
System.out.println("C[1]元素"+C[1]);
System.out.println("C[2]元素"+C[2]);
System.out.println("C[3]元素"+C[3]);
System.out.println("C[4]元素"+C[4]);
}
}
注意事项
索引范围:
- 数组索引从
0
开始,最大为长度-1
。 - 越界访问会抛出
ArrayIndexOutOfBoundsException
。
package com.jianstudy.array;
public class ArrayDemo03 {
public static void main(String[] args) {
//数组下标越界
int[] nums = new int[5];
nums[0]=1;
nums[1]=5;
nums[2]=3;
nums[3]=2;
nums[4]=6;
//nums数组只有0-4号5个元素,nums[5]已经超过了数组的边界会报错数组下标越界 ArrayIndexOutOfBoundsException
System.out.println("第5号元素的值"+nums[5]);
}
}