目录
概述
数组是什么:
数组是一个容器,用于存储同类型的数据
为什么有数组:
没有数组:大量变量的定义、实现需求繁琐
使用场景:批量数据的存储和操作,数组比变量更合适
静态初始化数组
定义数组的时候直接给数组赋值
格式:
//完整格式
数据类型[] 数组名 = new 数据类型[]{元素1,元素2,元素3,....};
int[] ages = new int[]{12,24,36};
double90 scores = new double[]{89.9,99.5,59.6,12.0};
//简化格式
数据类型[] 数组名 = {元素1,元素2,元素3,.....};
int[] ages = {12,34,56};
注意:
- 数据类型[] 数组名也可以写成 数据类型 数组名[]
- 什么类型的数组只能存放什么类型的数据
数组变量名存储的是对应的数组在内存中的地址信息
数组的访问
数组名[索引](数组中的索引从0开始)
数组的长度属性:length
int[] arr = {12,34,56,78};
System.out.printIn{arr.length); //获取数组的长度,其实就是数组元素的个数
数组的最大索引:数组名.length-1(元素个数>0)
使用的索引超过数组的最大索引的后果:出bug,出现索引越界的提示
数组遍历
遍历:一个一个访问数据
遍历数组的原因:实现各种功能需要(求和,元素搜索,找最大值/最小值...)
数据类型[] 数组名 = {元素1,元素2,元素3,.....};
for (初始化变量i;i<数组名.length;i++){
循环体;
}
动态初始化数组
定义数组时不存入具体的元素值,只确定数组存储的数据类型和数组的长度
格式:
数据类型[] 数组名 = new 数据类型[长度];
//例如:
//int[] arr = new int[3];
注意:
静态初始化和动态初始化数组的写法是独立的,不能混用
动态初始化数组元素默认值规则:
数组的内存执行原理
数组的执行原理
存储结构:在java中,数组是一块连续的内存区域,用于存储同类型数据,由于是连续存储的,所以数组的大小在创建时是固定的。
内存分配:创建数组时,jvm会在堆内存中分配一块连续的内存空间(数组的引用变量存储在栈内存中,指向堆内存中的数组对象)
内存访问:通过索引访问元素时,jvm根据起始地址和索引计算元素的内存地址,进行读写操作。
动态特性:虽然数组在创建时是固定的,但是在java中可以通过创建一个新的数组并且复制原数组的元素实现动态扩容,步骤如下:
- 创建一个相对更大的数组
- 将原来的数组复制到新数组中
- 更新引用变量指向新数组
垃圾回收:数组不再被引用时,jvm垃圾回收机制会自动回收其占用的内存。
java内存分配介绍
方法区:字节码文件先加载到这个区域
栈:方法运行时所进入的内存,变量也是在这里
堆内存:new出来的东西会在这块内存开辟空间并产生地址
多个变量指向同一个数组的问题
多个数组变量中存储的是同一个数组对象的地址,需要注意的是多个变量修改的都是同一个数组对象中的数据。如果某个数组变量中存储的null,代表这个数组变量没有指向数组对象,此时可以输出这个变量,但是不能去访问这个数组变量的数据和数组长度。
数组案例
数组反转
public class Test2{
public static void main(String[] args){
int[] arr = {10,20,30,40,50};
for(int i = 0, j = arr.length - 1; i < j; i++;j--){
int temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
for(int i = 0;i < arr.length;i++){
System.out.printIn(arr[i] + " ");
}
}
}
随机排名
import java.util.Scanner;
import java.util.Random;
public class Test1{
int[] codes = new int[5];
Scanner sc = new Scanner(System.in);
for(int i=0;i<codes.length;i++){
System.out.printIn("请您输入当前第"+(i+1)+"个员工的工号:");
int code = sc.nextInt();
codes[i] = code;
}
Random r = new Random();
for(int i=0;i<codes.length;i++){
int index = r.nextInt(codes.length);
int temp = codes[index];
codes[index] = codes[i];
codes[i] = temp;
}
for(int i = 0;i<codes.length;i++){
System.out.print(codes[i] + " ");
}
补充:debug工具使用
Debug工具:
IDEA自带的断点调试工具,可以控制代码从断点开始一行一行的执行,然后详细观看程序执行的情况
- 在需要控制的代码行左侧,点击一下,形成断点(行号右边深色部分 非代码区域)
- Debug "程序名",启动后程序会在断点处暂停
往下走,控制程序一行一行的往下执行
- 可以看到详细的取值信息