四、Java之数组

一、JVM内存的划分

堆:存储的是局部变量和方法的调用

栈:存储的是new出来的对象

方法区:用于存储类的元数据信息

本地方法区:用于存储Java程序中调用本地方法(Native Method)的相关信息。本地方法通常用于访问底层系统资源或执行与平台相关的操作,例如操作系统API调用、硬件访问等。

寄存器:是位于CPU内部的一组特殊用途的高速存储器。它们用于存储和处理指令执行过程中的数据、地址和控制信息。

 

二、数组

数组:是一个存储多个元素的容器, 是一块连续的内存空间,每一个位置都有索引进行标识

特点: 同一个数组中,只能存储同一种数据类型的元素.

数组定义:数据类型[] 数组名;

数组的初始化:

      动态初始化:初始化时只指定数组长度,由系统为数组分配初始值。

          语句定义格式: 数据类型[] 数组名 = new 数据类型[元素的个数];

      静态初始化:初始化时指定每个数组元素的初始值,由系统决定数组长度

       语句定义格式: 数据类型[] 数组名 = new 数据类型[]{元素1,元素2,...};

                  简化写法: 数据类型[] 数组名 = {元素1,元素2,...}

注意事项:
1、数组的动态初始化和静态初始化不能混合使用
2、虽然静态初始化后数组中存储就是我们自己给的数据了,但是要记住一点,在一开始的时候,系统依旧会赋予默认值

属性:length   作用:获取数组中的元素个数(数组长度),结果是一个整数 

 

复制代码
package com.shujia.day04;

/*
    数组遍历(依次输出数组中的每一个元素)

 */
public class ArrayTest1 {
    public static void main(String[] args) {
        //定义并初始话一个数组
        int[] arr = {11, 22, 33, 44, 55, 66};
        //在知道数据的范围的情况下,使用for循环
//        for (int i = 0; i < 6; i++) {
//            System.out.println(arr[i]);
//        }
        //将来数组中的元素个数我们不一定能够数的清
        //java中数组提供了一个属性给我们使用 length
        //格式: 数组名.length 获取的是数组的长度
        for (int i = 0; i < arr.length; i++) {
            if(i==0){
                System.out.print("["+arr[0]+",");
            }else if(i==arr.length-1){
                System.out.println(arr[i]+"]");
            }else {
                System.out.print(arr[i]+",");
            }
        }
    }
}
复制代码

 

 

 

 

常见错误:
数组索引越界异常:ArrayIndexOutOfBoundsException
空指针异常:NullPointerException

 

                              数组动态初始化内存图

 

                  数组动态初始化并赋值

 

 

                   两个数组指向同一个堆内存空间

三、一维数组
复制代码
package com.shujia.day03.ketang;

/*
    数组:是一个存储多个元素的容器, 是一块连续的内存空间,每一个位置都有索引进行标识

    特点: 同一个数组中,只能存储同一种数据类型的元素.
    数组的定义:
        语句定义格式: 数据类型[] 数组名;
    数组光定义出来不能直接使用,需要对数组进行初始化
    两种初始化的方式:
        1. 动态初始化: 初始化时只指定数组长度,由系统为数组分配初始值。
        2. 静态初始化: 初始化时指定每个数组元素的初始值,由系统决定数组长度。

    动态初始化:
        语句定义格式: 数据类型[] 数组名 = new 数据类型[元素的个数];
        举例:创建一个可以存储3个int类型的数组
            int[] arr = new int[3];
   局部变量: 方法上或者方法内部定义的变量统称为局部变量,在栈中出现

 */
public class ArrayDemo1 {
    public static void main(String[] args) {
        //定义一个存储int类型元素的数组
//        int[] arr;
//        System.out.println(arr);

        /**
         *
         * 左边:
         *  int: 表示该数组中的元素都是int类型
         *  []: 表示该数组是一个一维数组
         *  arr: 是数组的名字,符合标识符命名规则
         *
         * 右边:
         *  new: 在堆内存中开辟空间
         *  int: 表示该数组中的元素都是int类型
         *  []: 表示该数组是一个一维数组
         *  3: 表示的是该数组可以存储3个元素
         *
         */
//        int[] arr = new int[3];
        int[] arr = new int[3];
        System.out.println(arr); //[I@4554617c
        //实际中,更需要获取数组中的元素值
        //java中提供了获取元素的方式,数组中每一个元素都有一个位置下标索引,可以通过索引获取对应位置上的元素
        //语句格式: 数组名[下标索引] 索引从左向右,从0开始
        int a = arr[0];
        System.out.println(a);
        int a2 = arr[1];
        System.out.println(a2);
        int a3 = arr[2];
        System.out.println(a3);

    }

    public static void sum(int a,int b){

    }
}
复制代码

 

 四、二维数组
二维数组:元素是一维数组的数组
二维数组的格式1;
   语句定义格式1:数据类型[][] 数组名 = new 数据类型[m][n];
二维数组的格式2:
语句定义格式:数据类型[][] 数组名 = new 数据类型[m][];
二维数组格式3:
语句定义格式:
数据类型[][] 数组名 = new 数据类型[][]{{元素1,元素2,..},{},{},{},..};
简化写法:
数据类型[][] 数组名 ={{元素1,元素2,..},{},{},{},..};
复制代码
package com.shujia.day04;

/*
    举例:创建一个可以存储3个一维数组的二维数组,并且每个一维数组中可以存储2个int类型的元素
    int[][] arr = new int[3][2];
    以下都是正确写法:
        int[] arr[] = new int[3][2];
        int arr[][] = new int[3][2];
        int [] [] arr = new int[3][2];

 */
public class Array2Demo1 {
    public static void main(String[] args) {
        int[][] arr = new int[3][2];
        System.out.println(arr);
        System.out.println(arr[0]); //打印的是第一个一维数组的地址值
        System.out.println(arr[1]);
        System.out.println(arr[2]);

        //打印第二个一维数组的第二个元素
        System.out.println(arr[1][1]); // 0
    }
} 
复制代码
 二维数组的遍历:
复制代码
package com.shujia.day04;

/*
    二维数组遍历
 */
public class Array2Test1 {
    public static void main(String[] args) {
        String[][] shujia = {{"小花", "小红", "小黑"}, {"花花", "乐乐"}, {"中义", "海兵", "龙俊", "鹏程"}};

        //思路是遍历到每一个一维数组,然后再遍历每一个一维数组中的元素
        for (int i = 0; i < shujia.length; i++) { //外层for循环表示遍历到每一个一维数组
            for (int j = 0; j < shujia[i].length; j++) {  //内层for循环表示遍历每个一维数组的每个元素
                System.out.println(shujia[i][j]);
            }
            System.out.println("----------------------");
        }
    }
}
复制代码

 

                                                  二维数组内存图

 

 五、传参的问题
1、当基本数据类型作为方法的参数类型的时候,调用时传入的是具体的数值
2、当引用数据类型作为方法的参数类型的时候,调用时传入的是对应的地址值

 

 

 

posted @   SIKeborn  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示