数组的定义和使用
1.数组基本用法
1.1数组——一块连续的内存,存储的是相同数据类型的集合。
数组本质上就是——批量的创建相同类型的变量。
在Java中,数组中包含的变量必须是相同类型。
1.2创建数组
基本语法:
//动态初始化
数据类型[] 数组名称 = new 数据类型 [] {初始化数据};
//静态初始化
数据类型[] 数组名称 = {初始化数据};
代码示例:
//静态初始化
int[] arr = {1,2,3};
//动态初始化
int[] arr1 = new int[]{1,2,3};
静态初始化的时候,数组元素个数和初始化数据的格式是一致的。
1.3数组的使用
举例:——获取长度&访问元素
public class Test {
public static void main(String[] args) {
//静态初始化
int[] arr = {1,2,3};
//获取数组长度
System.out.println("length = " + arr.length);
//访问数组中的元素
System.out.println(arr[1]);
System.out.println(arr[0]);
arr[2] = 100;
System.out.println(arr[2]);
}
}
(1)使用arr.length 能够获到数组的长度, . 是成员访问操作符;
(2)使用 [] 按下标取数组元素。——下标从0开始计数;
(3)使用 [] 操作既能读取数据,也能修改数据;
(4)下标访问操作不能超出有效范围 [0,length - 1] ,如果超出有效范围,会出现下标越界访问。
举例2——遍历数组——(遍历:即是指将数组中的所有元素收访问一遍,常使用循环语句)
public class Test {
//2.遍历数组
public static void main(String[] args) {
int [] arr = {1,2,3,4,5};
for (int i = 0; i <arr.length ; i++) {
System.out.println(arr[i]);
}
}
}
举例3——使用foreach遍历数组
public class Test {
//3.使用foreach遍历数组
public static void main(String[] args) {
int[] arr = {7,8,9,0};
for (int x:arr){
System.out.println(x);
}
}
}
举例4——使用操作数组的工具类Array.toString()——将数组以字符串的形式进行输出
public class Test {
//4.使用操作数组的工具类Arrays.toString()——将数组以字符串的形式输出
public static void main(String[] args) {
int[] arr = {4,5,7,6};
System.out.println(Arrays.toString(arr));
}
}
2.数组作为方法的参数
2.1基本用法
举例1 ——打印数组内容
public class Test {
//5.打印数组内容
public static void main(String[] args) {
int[] arr1 = {2,3,4,8,5};
printArray(arr1);
}
public static void printArray(int[] arr){
for(int x:arr){
System.out.println(x);
}
}
}
此代码中 int[] arr是函数形参;int[] arr1是函数实参。
2.2引用类型
举例2—— 参数传内置类型
public class Test {
//6.参数传内置类型
public static void main(String[] args) {
int num = 10;
func(num);
System.out.println("num = " + num);
}
public static void func(int x){
x = 10;
System.out.println("x = " + x);
}
执行结果:
可发现修改形参x的值,并不影响实参的num 值。
举例2——参数传数组类型
public class Test {
//7.参数传数组类型
public static void func1(int[] arr){
arr[0] = 10;
System.out.println("arr[0] = " + arr[0]);
}
public static void main(String[] args) {
int[] arr1 = {12,13,11,15};
func1(arr1);
System.out.println("arr1[0] = " + arr1[0]);
}
}
执行截图:
可发现:在函数内部修改数组内容,函数外部也发生改变;
此时数组名arr1是一个“引用”,当传参的时候,是按照引用传参。
所谓引用:——本质上是存了一个地址。
Java数组设定成引用类型——方便进行数组参数传参——即将数组的地址传入到函数形参中。
2.3null
null——在Java中表示“空引用”——即一个无效的引用。——因此不可对此引用指向对象的内存进行任何读写操作——会抛出NullPointerException
2.4JVM 内存区域划分
(1)JVM Stack——虚拟机栈——重点是存储局部变量表:
(2)本地方法栈——保存的是Native方法的局部变量;
(3)堆——JVM所管理的最大内存区域——使用new创建的对象都是在堆上保存;
(4)程序计数器——保存下一条执行的指令地址;
(5)方法区——用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据;方法编译出的字节码就是保存在这个区域。
3.数组作为方法的返回值
举例—— 数组作为方法的返回值——写一个方法,将数组中的每一个元素 * 2
代码实现:
public class Test {
//8.数组作为方法的返回值——写一个方法,将数组中的每一个元素 * 2
public static void main(String[] args) {
int[] arr = {1,2,3,4};
int[] output = transform(arr);
printArray1(output);
}
public static void printArray1(int[] arr){
for (int i = 0; i < arr.length ; i++) {
System.out.println(arr[i]);
}
}
public static int[] transform(int[] arr){
int[] ret = new int[arr.length];
for (int i = 0; i < arr.length; i++) {
ret[i] = arr[i] * 2;
}
return ret;
}
执行结果:
4.使用数组的常见问题:
(1)下标越界——ArrayIndexOutOfBoundsException
(2)空指针异常——NullPointerException——需检查哪个引用为null
null ——引用对应的0值——不知其指向的对象时,置为null
int array2 = null;//此引用不指向任何对象。
5.for 与 foreach 循环的区别:
for:可使用下标访问找到某元素;
foreach:没有下标。