08-数组
数组介绍
数组可以存放多个同一类型的数据。
数组也是一种数据类型,是引用数据类型。即:数组就是一组数据。
在Java中,数组要求所有数组元素具有相同的数据类型。在一个数组中,数组元素类型是唯一的,只能储存同一种数据类型,不能出现多种数据类型。
数组的声明和创建
首先必须声明数组变量,才能在程序中使用数组
数组定义格式:
a) 数据类型[ ] 数组名; 例如 int[] array; //首选的方法
b) 数据类型 数组名[ ]; 例如 int array[]; //不是首选的方法,但效果相同
数组的引用(使用/访问/获取数组元素)
数组元素是通过索引访问的,编号从0开始
数组访问格式:
数组名 [索引]; 例如 a数组的第三个元素 a[2]
扩展:可以通过 数组名.length 方法, 得到数组的大小/长度
数组的初始化(动态初始化和静态初始化)
a) 动态初始化:
手动指定数组长度,由系统给出默认初始化值。
格式:数据类型[ ] 数组名 = new 数据类型[数组长度];
b) 静态初始化:
手动指定数组元素,系统会根据元素个数,计算出数组的长度。
完整格式为:数据类型[ ] 数组名 = new 数据类型[ ]{元素1,元素2,元素3…};
简化格式为:数据类型[ ] 数组名 = {元素1,元素2,元素3…};
import java.util.Scanner; public class Array02{ public static void main(String[] args){ //1.动态初始化:手动指定数组长度,由系统给出默认初始化值 //例如,键盘录入5个学生成绩,保存到 double数组 ,并输出 //动态初始化,创建一个 double 数组,大小为5 double[] scores = new double[5]; //循环输入 Scanner sc = new Scanner(System.in); for(int i = 0; i < scores.length; i++){ System.out.println("请输入第" + (i+1) + "个学生的成绩:"); scores[i] = sc.nextDouble(); } //输出,遍历数组 System.out.println("===数组的元素/值的情况如下:==="); for(int i = 0; i < scores.length; i++){ System.out.println("第" + (i+1) + "个学生的成绩:" + scores[i]); } //2.静态初始化:手动指定数组元素,系统会根据元素个数,计算出数组的长度 //例如,已知班级学生成绩为100、90、80、60、55,保存到 double数组,并输出 //静态初始化,创建一个 int 数组 double[] scores2 = {100,90,80,60,55}; System.out.println("===数组的元素/值的情况如下:==="); //输出,遍历输出 for(int i = 0; i < scores2.length; i++){ System.out.println("第" + (i+1) + "个学生的成绩:" + scores2[i]); } } }
数组内存图
Java内存主要分为堆、栈、方法区。
堆:存放 new 的对象和数组。堆可以被所有的线程共享,不会存放别的对象引用。
栈:存放基本数据类型(基本类型的具体数值)和引用数据类型(在堆里面的具体地址);方法运行时所进入的内存。
方法区:字节码文件加载时进入的内存;方法区可以被所有的线程共享;方法区包含了所有的 class 和 static 变量。
数组赋值机制(方法参数传递)
1. 对于基本数据类型,传递的是数据值(值传递)
2. 对于引用数据类型,传递的是地址值(引用传递)
这里需要注意:基本数据类型,传递的是具体的数据,相互之间不影响。而数组在默认情况下是引用传递,如果堆内存中的数组已经被修改了,则相应的也会发生修改
public class ArrayTest{ public static void main(String[] args){ //1. 基本类型赋值,传递的是数据值 //n2的变化不会影响n1的值 int n1 = 10; int n2 = n1; n2 = 20; System.out.println("n1 = " + n1); //n1 = 10; System.out.println("n2 = " + n2); //n2 = 20; //2. 引用类型赋值,传递的是地址 //arr2的变化会影响到arr1 int[] arr1 = {10,20,30}; int[] arr2 = arr1; arr2[0] = 100; System.out.println("arr1[0] = " + arr1[0]); //arr1[0] = 100 System.out.println("arr2[0] = " + arr2[0]); //arr2[0] = 100 } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)