• JavaSE | 初识Java(六) | 数组 (上)


    数组的创建及初始化
    1. T[] 数组名 = new T[N];
    2. //T:表示数组中存放元素的类型
    3. //T[]:表示数组的类型
    4. //N:表示数组的长度
    1. int[] array1 = new int[10]; // 创建一个可以容纳10个int类型元素的数组
    2. double[] array2 = new double[5]; // 创建一个可以容纳5个double类型元素的数组
    3. String[] array3 = new double[3]; // 创建一个可以容纳3个字符串元素的数组
    数组的初始化
    数组的初始化主要分为 动态初始化以及静态初始化
    1. 动态初始化:在创建数组时,直接指定数组中元素的个数
    int[] array = new int[10];
    2. 静态初始化:在创建数组时不直接指定数据元素个数,而直接将具体的数据内容进行指定
    1. int[] array1 = new int[]{0,1,2,3,4,5,6,7,8,9};
    2. double[] array2 = new double[]{1.0, 2.0, 3.0, 4.0, 5.0};
    3. String[] array3 = new String[]{"hell", "Java", "!!!"};
    【注意事项】
    • 静态初始化虽然没有指定数组的长度,编译器在编译时会根据{}中元素个数来确定数组的长度。
    • 静态初始化时, {}中数据类型必须与[]前数据类型一致。
    • 静态初始化可以简写,省去后面的new T[]
    1. // 注意:虽然省去了new T[], 但是编译器编译代码时还是会还原
    2. int[] array1 = {0,1,2,3,4,5,6,7,8,9};
    3. double[] array2 = {1.0, 2.0, 3.0, 4.0, 5.0};
    4. String[] array3 = {"hell", "Java", "!!!"};
    • 数组也可以按照如下C语言个数创建,不推荐
    1. /*
    2. 该种定义方式不太友好,容易造成数组的类型就是int的误解
    3. []如果在类型之后,就表示数组类型,因此int[]结合在一块写意思更清晰
    4. */
    5. int arr[] = {1, 2, 3};
    • 静态和动态初始化也可以分为两步,但是省略格式不可以
    1. int[] array1;
    2. array1 = new int[10];
    3. int[] array2;
    4. array2 = new int[]{10, 20, 30};
    5. // 注意省略格式不可以拆分, 否则编译失败
    6. // int[] array3;
    7. // array3 = {1, 2, 3};
    • 如果没有对数组进行初始化,数组中元素有其默认值(通常为0)

    注意:在数组中可以通过 数组对象.length 来获取数组的长度

    1. int[]array = new int[]{10, 20, 30, 40, 50};
    2. for(int i = 0; i < array.length; i++){
    3. System.out.println(array[i]);
    4. }
    也可以使用 for-each 遍历数组
    1. int[] array = {1, 2, 3};
    2. for (int x : array) {
    3. System.out.println(x);
    4. }
    for-each for 循环的另外一种使用方式 . 能够更方便的完成对数组的遍历 . 可以避免循环条件和更新语句写错 .
    数组是引用类型
    初始 JVM 的内存分布
    • 程序计数器 (PC Register): 只是一个很小的空间, 保存下一条执行的指令的地址
    • 虚拟机栈(JVM Stack): 与方法调用相关的一些信息,每个方法在执行时,都会先创建一个栈帧,栈帧中包含 有:局部变量表操作数栈动态链接返回地址以及其他的一些信息,保存的都是与方法执行时相关的一 些信息。比如:局部变量。当方法运行结束后,栈帧就被销毁了,即栈帧中保存的数据也被销毁了
    • 本地方法栈(Native Method Stack): 本地方法栈与虚拟机栈的作用类似. 只不过保存的内容是Native方法的局部变量. 在有些版本的 JVM 实现中(例如HotSpot), 本地方法栈和虚拟机栈是一起的
    • (Heap): JVM所管理的最大内存区域. 使用 new 创建的对象都是在堆上保存 (例如前面的 new int[]{1, 2, 3} )堆是随着程序开始运行时而创建,随着程序的退出而销毁,堆中的数据只要还有在使用,就不会被销
    • 方法区(Method Area): 用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数 . 方法编译出的的字节码就是保存在这个区域
    基本数据类型创建的变量,称为基本变量,该变量空间中直接存放的是其所对应的值;
    而引用数据类型创建的变量,一般称为对象的引用,其空间中存储的是对象所在空间的地址。
    1. public static void func() {
    2. int a = 10;
    3. int b = 20;
    4. int[] arr = new int[]{1,2,3};
    5. }
    在上述代码中, a b arr ,都是函数内部的变量,因此其空间都在 main 方法对应的栈帧中分配。
    a、 b 是内置类型的变量,因此其空间中保存的就是给该变量初始化的值。
    array是数组类型的引用变量,其内部保存的内容可以简单理解成是数组在堆空间中的首地址。
    从上图可以看到, 引用变量并不直接存储对象本身,可以简单理解成存储的是对象在堆中空间的起始地址。通过该 地址,引用变量便可以去操作对象 。有点类似 C 语言中的指针,但是 Java 中引用要比指针的操作更简单。
    1. public static void func() {
    2. int[] array1 = new int[3];
    3. array1[0] = 10;
    4. array1[1] = 20;
    5. array1[2] = 30;
    6. int[] array2 = new int[]{1,2,3,4,5};
    7. array2[0] = 100;
    8. array2[1] = 200;
    9. array1 = array2;
    10. array1[2] = 300;
    11. array1[3] = 400;
    12. array2[4] = 500;
    13. for (int i = 0; i < array2.length; i++) {
    14. System.out.println(array2[i]);
    15. }

    null Java 中表示 " 空引用 " , 也就是一个不指向对象的引用 .
    1. int[] arr = null;
    2. System.out.println(arr[0]);
    3. // 执行结果
    4. Exception in thread "main" java.lang.NullPointerException
    5. at Test.main(Test.java:6)
    null 的作用类似于 C 语言中的 NULL ( 空指针 ), 都是表示一个无效的内存位置 . 因此不能对这个内存进行任何读写操 作. 一旦尝试读写 , 就会抛出 NullPointerException.
    参数传数组类型 ( 引用数据类型)
    1. public static void main(String[] args) {
    2. int[] arr = {1, 2, 3};
    3. func(arr);
    4. System.out.println("arr[0] = " + arr[0]);
    5. }
    6. public static void func(int[] a) {
    7. a[0] = 10;
    8. System.out.println("a[0] = " + a[0]);
    9. }
    10. // 执行结果
    11. a[0] = 10
    12. arr[0] = 10

    作为函数的返回值

    比如:获取斐波那契数列的前N

    1. public class TestArray {
    2. public static int[] fib(int n){
    3. if(n <= 0){
    4. return null;
    5. }
    6. int[] array = new int[n];
    7. array[0] = array[1] = 1;
    8. for(int i = 2; i < n; ++i){
    9. array[i] = array[i-1] + array[i-2];
    10. }
    11. return array;
    12. }
    13. public static void main(String[] args) {
    14. int[] array = fib(10);
    15. for (int i = 0; i < array.length; i++) {
    16. System.out.println(array[i]);
    17. }
    18. }
    19. }

  • 相关阅读:
    【RabbitMQ】——入门&安装
    黑马JVM总结(四)
    Linux学习笔记——C程序的编译运行与调试
    不用USB,通过adb无线调试安卓手机页面
    LLM的基础模型3:Transformer变种
    环境配置、如何安装OpenHarmony HAR
    专业制造一体化ERP系统,专注于制造工厂生产管理信息化,可定制-亿发
    Sentinel 熔断与限流
    中文编程入门(Lua5.4.6中文版)第十二章 Lua 协程 参考《愿神》游戏
    从物理转AI、战数据库,95后程序员的职业选择
  • 原文地址:https://blog.csdn.net/khh1014173041/article/details/133499145