Java学习之数组详解

这篇博客详细介绍了Java中的一维和二维数组的使用,包括静态和动态初始化,数组在内存中的存放方式,以及数组元素的默认初始化值。还探讨了二维数组的初始化规则及其内存解析,展示了如何遍历和访问数组元素,并讨论了数组对象在内存中的生命周期和垃圾回收机制。
摘要由CSDN通过智能技术生成

 

1.数组的概念

数组是一种数据结构,它可以存储相同数据类型的固定大小的元素集合,每个元素都由至少一个数组索引或键标识。最简单的数据结构类型是线性数组,也称为一维数组。

What Are The Differences Between Ruby Arrays And Hashes, And When To Use  Each? â Tony Mai

2.一维数组的使用

2.1 一维数组的初始化

public class CreateArray {
	public static void main(String args[]) {
        //静态初始化
        int[] arr;
        arr=new int[]{1,2,3,4};
        //或者使用类型推断
        int[] arr={1,2,3,4}
        //动态初始化
        String[] str=new String[5];
        //一维数组的长度
        int arrLength=arr.length;
        //一维数组的遍历
        for(int i=0;i<arr.length;i++)
        {
            System.out.println(arr[i]);
        }
    }
}

2.2 Java数组在内存中的存放

数组属于引用数据类型,发生引用传递。

Java虚拟机在执行Java程序的过程中会把它管理的内存划分成若干个不同的数据区域:

被用来寻出局部变量,对存入其中的变量不会自动赋值,变量在使用完成之后会立即移出栈内存释放空间;对应int[] arr;

被用来存储对象(所有new出来的东西),堆内存对于存入其中的元素会自动的赋予初始值对象使用完成之后不会立即移出堆内存,而是在不定的某个时刻被回收;对应arr=new int[]{1,2,3,4};在这行代码里,arr变量存放了数组对象的引用,数组对象所占的空间在堆上被分配,然后返回其引用;

 在堆中有一个首地址值,用十六进制的数表示,这个地址值被赋给栈空间中的局部变量,栈通过这个地址值找到堆中的数组。最开始的时候堆中数组先被赋予初始值,再被赋上给定的值。

 如果重新new了一次(如下图arr1=new String[3];),堆空间中会被开辟新的对象(0x566),指向原来堆空间中数组(0x12ab)的指针会消失。垃圾回收机制会判断原来堆中的那个数组(0x12ab)是否被栈引用,如果没有则在之后某个不确定的时间被当成垃圾回收。如果在程序执行完后栈中变量被删除,堆中的对象也没有引用指向它们了,所以也会被当成垃圾回收。

2.3 数组元素的默认初始化值

数组元素在堆中有如下默认初始化值, 如果初始化数组时不赋值将会被输出为:

1.数组元素是整型(byte,short,int,long):0

2.数组元素是浮点数:0.0

3.数组元素是char型:ASCII码中存储字符地址为0的地方,值为0但输出是空格,或称为'\u0000'

4.数组元素是boolean型:false

5.元素是引用数据类型(String、类、数组、接口):null 

3.二维数组的使用

3.1 二维数组的初始化

public class TwoDimentionalArray {
	public static void main(String args[]) {
        //静态初始化的几种合法方法
        int[][] arr1=new int[][]{{1,2,3},{4,5},{6,7,8}};
        int[] arr1[]=new int[][]{{1,2,3},{4,5},{6,7,8}};
        int[][] arr1={{1,2,3},{4,5},{6,7,8}};

        //动态初始化的几种合法方法
        int[][] arr2=new int[3][];
        int[][] arr2=new int[3][2];

        //不合法的用法
        int[][] arr2=new int[][2];
        int[4][3] arr2=new int[][];
        int[][] arr2=new int[3][2]{{1,2,3},{4,5},{6,7,8}};//后面赋值了前面就不能有长度
        
        //二维数组的长度
        System.out.println(arr1.length);//3  为二维数组的行数
        Syetem.out.println(arr1[0].length)//3 二维数组第0行的列数
        System.out.println(arr1[1].length)//2
        
        遍历二维数组
        for(int i=0;i<arr1.length;i++)
        {
            for(int j=0;j<arr1[i].length;j++)
            {
                System.out.println(arr1[i][j]);

            }
        }
    }
}

3.2 二维数组的内存解析

public class TwoDimentionalArray {
	public static void main(String args[]) {
        int[][] arr=new int[3][3];
        System.out.println(arr[0]);//[I@15db9742 输出的是arr[0]的地址
        System.out.println(arr[0][0]);//0
        System.out.println(arr);//[[I@6d06d69c 输出的是arr的地址

        int[][] arr=new int[3][];
        System.out.println(arr[1]);//内层元素没有初始化所以是输出null
        System.out.println(arr[1]);//会报错java.lang.NullPointerException空指针异常
        //因为arr[1]处没有指针
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值