精华内容
下载资源
问答
  • Java多维数组初始化的问题

    千次阅读 2019-01-11 09:31:47
    昨天遇到了三维数组初始化的问题,代码如下, int[][][] arr = new int[2][][]; arr[1] = new int[][]{{1,2}, {3,4}, {5,6}};//这里出问题了 研究了一下后有所收获,思考过程都在代码注释中,主要是快速初始化和...

    昨天遇到了三维数组初始化的问题,代码如下,

    int[][][] arr = new int[2][][];
    arr[1] = new int[][]{{1,2}, {3,4}, {5,6}};//这里出问题了

    研究了一下后有所收获,思考过程都在代码注释中,主要是快速初始化和匿名数组的问题。这里只是找到了一个可以编译的写法,盲人摸象,想要高屋建瓴的理解还是去了解Java编译器和虚拟机。

    import java.util.Arrays;
    public class Test
    {
        public static void main(String[] args)
        {
            //声明了一个数组变量,但是这个变量还没有初始化,
            // 也就是说没有指向任何内存,甚至连null都不是,此时还不能使用
            int[] a;
    
            a = null;//数组也是对象,将a初始化为null
            System.out.println(Arrays.toString(a));
    
            a = new int[5];//将a初始化为一个长度为5的整型数组,数组中的元素默认初始化为0
            System.out.println(Arrays.toString(a));
    
            a = new int[]{1, 2, 3, 4, 5};//创建了一个匿名数组,并将a指向这个匿名数组
            System.out.println(Arrays.toString(a));
    
            //这是创建数组对象并同时赋值的简化书写形式,不需要调用new,也不能调用new
            int[] smallPrimes = {2, 3, 5, 7, 11};
            System.out.println(Arrays.toString(smallPrimes));
    
            /*
             * java中没有多维数组,也就是说arr表示引用一个数组,这个数组中存放的应该是int[][]型的引用
             * 但是这个时候arr没有初始化,它甚至连null都不是
             * */
    
            int[][][] arr = new int[2][][];
             /* new int[2][][]将在堆中开辟内存,内存的大小为两个int[][]型引用的长度
             * 默认初始化为null,也就是说arr[0]和arr[1]都是null
             * 如果要给arr[0]赋值,需要赋一个int[][]型的引用值,
             * 像下面这样*/
            arr[0] = new int[3][3];
            /*
             * 下面是创建一维数组对象并同时赋值的简化书写形式,
             * 不需要调用new,也不能调用new
             *int[] smallPrimes = {2, 3, 5, 7, 11};
             * 如果想要像这样给arr[1]赋值,应该已经没有机会了
             *
             * 下面是通过创建匿名数组初始化一维数组a
             * a = new int[]{1, 2, 3, 4, 5};//创建了一个匿名数组,并将a指向这个匿名数组
             * 如果是想要像这样给arr[1]赋值,考虑如何创建二维匿名数组
             *首先明确,二维数组中存放的是一维数组的引用,仿照一维数组的形式,
             * 在大括号中创建匿名一维数组就可以了*/
            arr[1] = new int[][]{new int[]{1, 2}, new int[]{3, 4}, new int[3], {}};
            System.out.println(Arrays.deepToString(arr));//查看arr的内容,是不规则数组
        }
    }

     

    展开全文
  • Java 中没有多维数组的概念,从数组底层的运行机制上来看 Java 没有多维数组,但是 Java 提供了支持多维数组的语法,可以实现多维数组的功能。Java 语言里的数组类型是引用类型,因此数组变量其实是一个引用,这个...

    Java 中没有多维数组的概念,从数组底层的运行机制上来看 Java 没有多维数组,但是 Java 提供了支持多维数组的语法,可以实现多维数组的功能。

    Java 语言里的数组类型是引用类型,因此数组变量其实是一个引用,这个引用指向真实的数组内存。数组元素的类型也可以是引用,如果数组元素的引用再次指向真实的数组内存,这种情形看上去很像多维数组。

    定义数组类型的语法type[] arrName;是典型的一维数组的定义语法,其中 type 是数组元素的类型。如果希望数组元素也是一个引用,而且是指向 int 数组的引用,则可以把 type 具体成 int[](前面已经指出,int[] 就是一种类型,int[] 类型的用法与普通类型并无任何区别),那么上面定义数组的语法就是int[][] arrName

    如果把 int 这个类型扩大到 Java 的所有类型(不包括数组类型),则出现了定义二维数组的语法:

    type[][] arrName;

    Java 语言采用上面的语法格式来定义二维数组,但它的实质还是一维数组,只是其数组元素也是引用,数组元素里保存的引用指向一维数组。

    接着对这个“二维数组”执行初始化,同样可以把这个数组当成一维数组来初始化,把这个“二维数组”当成一个一维数组,其元素的类型是 type[] 类型,则可以采用如下语法进行初始化:

    arrName = new type[length][]

    上面的初始化语法相当于初始化了一个一维数组,这一维数组的长度是 length。同样,因为这个一维数组的数组元素是引用类型(数组类型)的,所以系统为每个数组元素都分配初始值:null。

    这个二维数组实际上完全可以当成一维数组使用:使用new type[length]初始化一维数组后,相当于定义了 length 个 type 类型的变量。类似的,使用new type[length][]

    初始化这个数组后,相当于定义了 length 个 type[] 类型的变量。当然,这些 type[] 类型的变量都是数组类型,因此必须再次初始化这些数组。

    下面程序示范了如何把二维数组当成一维数组处理。

    public class TwoDimensionTest {
        public static void main(String[] args) {
            // 定义一个二维数组
            int[][] a;
            // 把a当成一维数组进行初始化,初始化a是一个长度为4的数组
            // a数组的数组元素又是引用类型
            a = new int[4][];
            // 把a数组当成一维数组,遍历a数组的每个数组元素
            for (int i = 0, len = a.length; i < len; i++) {
                System.out.println(a[i]); // 输出 null null null null
            }
            // 初始化a数组的第一个元素
            a[0] = new int[2];
            // 访问a数组的第一个元素所指数组的第二个元素
            a[0][1] = 6;
            // a数组的第一个元素是一个一维数组,遍历这个一维数组
            for (int i = 0, len = a[0].length; i < len; i++) {
                System.out.println(a[0][i]); // 输出 0 6
            }
        }
    }

    上面程序中粗体字代码部分把 a 这个二维数组当成一维数组处理,只是每个数组元素都是 null,所以看到输出结果都是 null。下面结合示意图来说明这个程序的执行过程。

    程序中代码int[][] a;

    将在栈内存中定义一个引用变量,这个变量并未指向任何有效的内存空间,此时的堆内存中还未为这行代码分配任何存储区。

    程序中代码a = new int[4][];对 a 数组执行初始化,这行代码让 a 变量指向一块长度为 4 的数组内存,这个长度为 4 的数组里每个数组元素都是引用类型(数组类型),系统为这些数组元素分配默认的初始值:null。此时 a 数组在内存中的存储示意图如图 1 所示。

    b88897f80f4fa6a60bbc88bd633d2251.png

    从图 1 来看,虽然声明 a 是一个二维数组,但这里丝毫看不出它是一个二维数组的样子,完全是一维数组的样子。这个一维数组的长度是 4,只是这 4 个数组元素都是引用类型,它们的默认值是 null。所以程序中可以把 a 数组当成一维数组处理,依次遍历 a 数组的每个元素,将看到每个数组元素的值都是 null。

    由于 a 数组的元素必须是 int[] 数组,所以接下来的程序对 a[0] 元素执行初始化,也就是让图 1 右边堆内存中的第一个数组元素指向一个有效的数组内存,指向一个长度为 2 的 int 数组。因为程序采用动态初始化 a[0] 数组,因此系统将为 a[0] 所引用数组的每个元素分配默认的初始值:0,然后程序显式为 a[0] 数组的第二个元素赋值为 6。此时在内存中的存储示意图如图 2 所示。

    f5961307a3a04eee4f7312c03aed1bf5.png

    图 2 中灰色覆盖的数组元素就是程序显式指定的数组元素值。TwoDimensionTest.java 接着迭代输出 a[0] 数组的每个数组元素,将看到输出 0 和 6。

    是否可以让图 2 中灰色覆盖的数组元素再次指向另一个数组?这样不就可以扩展成三维数组,甚至扩展成更多维的数组嘛?

    不能!至少在这个程序中不能。因为 Java 是强类型语言,当定义 a 数组时,已经确定了 a 数组的数组元素是 int[] 类型,则 a[0] 数组的数组元素只能是 int 类型,所以灰色覆盖的数组元素只能存储 int 类型的变量。对于其他弱类型语言,例如 JavaScript 和 Ruby 等,确实可以把一维数组无限扩展,扩展成二维数组、三维数组......,如果想在 Java 语言中实现这种可无限扩展的数组,则可以定义一个 Object[] 类型的数组,这个数组的元素是 Object 类型,因此可以再次指向一个 Object[] 类型的数组,这样就可以从一维数组扩展到二维数组、三维数组......

    从上面程序中可以看出,初始化多维数组时,可以只指定最左边维的大小;当然,也可以一次指定每一维的大小。例如下面代码:

    // 同时初始化二维数组的两个维数
    int[][] b = new int[3][4];

    上面代码将定义一个 b 数组变量,这个数组变量指向一个长度为 3 的数组,这个数组的每个数组元素又是一个数组类型,它们各指向对应的长度为 4 的 int[] 数组,每个数组元素的值为 0。这行代码执行后在内存中的存储示意图如图 3 所示。

    1b12cd780393ce40408f1c95675b5d74.png

    还可以使用静态初始化方式来初始化二维数组。使用静态初始化方式来初始化二维数组时,二维数组的每个数组元素都是一维数组,因此必须指定多个一维数组作为二维数组的初始化值。如下代码所示:

    // 使用静态初始化语法来初始化一个二维数组
    String[][] str1 = new String[][]{new String[3], new String[]{"hello"}};
    // 使用简化的静态初始化语法来初始化二维数组
    String[][] str2 = {new String[3], new String [] {"hello"}};

    上面代码执行后内存中的存储示意图如图 4 所示。

    b88897f80f4fa6a60bbc88bd633d2251.png

    通过上面讲解可以得到一个结论:二维数组是一维数组,其数组元素是一维数组。三维数组也是一维数组,其数组元素是二维数组…… 从这个角度来看,Java 语言里没有多维数组。

    展开全文
  • 除了一维数组和二维数组外,Java 中还支持更多维的数组,如三维数组、四维数组和五维数组等,它们都属于...多维数组的声明、初始化和使用都与二维数组相似,因此这里不再进行具体说明。例 1假设程序中有一个名为 na...

    除了一维数组和二维数组外,Java 中还支持更多维的数组,如三维数组、四维数组和五维数组等,它们都属于多维数组。通常也将二维数组看作是多维数组。本文以三维数组为例来介绍多维数组。

    三维数组有三个层次,可以将三维数组理解为一个一维数组,其内容的每个元素都是二维数组。依此类推,可以获取任意维数的数组。

    多维数组的声明、初始化和使用都与二维数组相似,因此这里不再进行具体说明。

    例 1

    假设程序中有一个名为 namelist 的 String 类型三维数组,下面编写代码对它进行遍历,输出每个元素的值。代码如下:public static void main(String[] args)

    {

    String[][][] namelist={{{"张阳","李风","陈飞"},{"乐乐","飞飞","小曼"}},

    {{"Jack","Kimi"},{"Lucy","Lily","Rose"}},

    {{"徐璐璐","陈海"},{"李丽丽","陈海清"}}};

    for(int i=0;i

    {

    for(int j=0;j

    {

    for(int k=0;k

    {

    System.out.println("namelist["+i+"]["+j+"]["+k+"]="+namelist[i][j][k]);

    }

    }

    }

    }

    执行上述代码,输出结果如下所示。namelist[0][0][0]=张阳

    namelist[0][0][1]=李风

    namelist[0][0][2]=陈飞

    namelist[0][1][0]=乐乐

    namelist[0][1][1]=飞飞

    namelist[0][1][2]=小曼

    namelist[1][0][0]=Jack

    namelist[1][0][1]=Kimi

    namelist[1][1][0]=Lucy

    namelist[1][1][1]=Lily

    namelist[1][1][2]=Rose

    namelist[2][0][0]=徐璐璐

    namelist[2][0][1]=陈海

    namelist[2][1][0]=李丽丽

    namelist[2][1][1]=陈海清

    展开全文
  • JAVA - 数组初始化

    2018-06-05 19:28:14
    JAVA数组变量是引用类型的变量,并不是数组对象本身,只要让数组变量指向...想要给数组对象分配存储空间,必须进行初始化* 默认初始化数组元素相当于对象的成员变量,默认值跟成员变量的规则一样int  0float ...

    JAVA的数组变量是引用类型的变量,并不是数组对象本身,只要让数组变量指向有效的数组对象,程序中就可使用该数组变量。声明数组只是得到了一个数组的引用并为该引用分配了存储空间,但是并没有给数组对象本身分配任何空间。想要给数组对象分配存储空间,必须进行初始化

    * 默认初始化

    数组元素相当于对象的成员变量,默认值跟成员变量的规则一样

    int                        0

    float                     0.0f

    double                 0.0

    boolean               false

    char                     ' '

    引用数据类型        null

    * 静态初始化

    在数组创建的地方进行初始化,采用这种初始化的方式,数组的存储空间的分配是由编译器完成的当创建一个非基本类型的数组时,实际上创建的是引用数组可以直接使用new在数组里创建元素

    :new可应用于基本类型的数组,但是不能应用于单个的基本类型

    int[] arr1 = {1,2,3,4,5};
    
    Integer[] arr2 = {new Integer(1), new Integer(2), new Integer(3)};

    注:这种声明方式其实只是Java初始化数组的语法糖,其等价于int[] arr1 = new int[]{1,2,3,4,5};

    * 动态初始化方式一

    new声明,之后分别初始化数组中的每个元素,声明时需指定数组大小

    注:如果数组元素类型为基本数据类型,在完成new 操作之后,数组中的元素会自动初始化为空值,可以直接使用,但是数组元素为引用类型,在完成new操作之后,没有给引用类型赋值,就直接使用数组中的元素,会产生运行时异常

    int[] array2 = new int[3];  
    array2[0] = 1;  
    array2[1] = 2;  
    array2[2] = 3;  

    * 动态初始化方式二

    new声明的同时初始化,这种方式不能指定数组的大小,数组大小由初始化列表中数据个数决定

    int[] array3 = new int[]{1,2,3};  

    * 给数组的引用赋值

    int[] arr1 = {1,2,3,4,5};
    int[] arr2;
    arr2 = arr1;

    注:Java实际上没有多维数组,只有释为“数组的数组。”,因此可以方便地构造一个“不规则”数组,即数组的每一行有不同的长度:

    int[][] balances = new int[LineNum + 1][];
    for(int n = 0; n < balances.length; n++) {
        balances[n] = new int[n+1];
    }
    System.out.println(Arrays.deepToString(balances));

    其内存分配如图所示:


    展开全文
  • Java多维数组

    2019-07-05 22:59:25
    除了一维数组和二维数组外,Java 中还支持更多维的数组,如三维数组、四维数组和五维数组等,它们都属于多维...多维数组的声明、初始化和使用都与二维数组相似,因此这里不再进行具体说明。 例 1 假设程序中有一...
  • Java多维数组声明格式

    千次阅读 2019-04-20 22:49:42
    刷题目再次遇到了声明这种最基本形式的考题,以此记录,...而arr11、arr12则是等式右边二维数组初始化时没有赋予初始大小导致报错。 正确的声明形式如下: 本质上arr0、arr4和arr3、arr8是一样的; 而arr1-2和arr5-...
  • java多维数组详解

    2020-11-12 18:52:41
    java中其实没有多维数组的概念,只不过是依据数组的概念以及特点技术上的延伸 本质上就是存储数组的数组 多维的数组的使用 ①声明 // ### ①声明 // 1)数据类型 [][] 数组名; // 创建一个存储整数类型数组 ...
  • 二维数组的初始化与一位数组初始化类似,同样可以使用静态初始化或动态初始化。 1)静态初始化 静态初始化的格式如下: 数组名字 = new 数组元素的类型[][]{new 数组元素的类型[]{元素1,元素2,...},new 数组元素...
  • 都大三了,要抓紧时间学习一点儿JAVA了,我就从基础开始一点... * Description: 演示一维数组和多维数组初始化和基本操作 * Copyright: Copyright (c) 2014 * Filename: myArray.java * @author w王海涛 * @ve
  • Java 多维数组遍历

    千次阅读 2016-07-18 23:22:43
    多维数组 数组是Java中的一种容器对象,它拥有多个单一类型的值。当数组被创建的时候数组长度就已经确定了。在创建之后,其长度是固定的。下面是一个长度为10的数组: 1 2 3 4 ...
  • java 多维数组

    2020-11-29 00:20:32
    问题:二维数组 可以像以下这样 int[] x,y[]; 初始化吗?
  •  1) 和其它编程语言的数组定义基本相同,具有2要素,分别是类型一致(数组中的数据都是一种类型的)和定长(初始化时就已经确定长度,这也意味着数组的内存空间也确定了,即大小不变了);  2) 在Java数组类型也...
  • java多维数组

    2020-03-02 23:04:00
    二维数组数组数组 int[][] arr = {{66,77},{789,921,520},{8,963,9}};
  • Java多维数组的使用

    2020-11-24 17:26:08
    多维数组的理解 初始化方式 public class test { public static void main(String[] args){ //静态初始化 int[][] arr = new int[][]{{1, 2, 3}, {4, 5}, {7, 8}}; //动态初始化1 int[][] arr1 = new int[3][2...
  • [#### 数组、多维数组,静态、动态初始化,都说明白了] 什么是数组 所谓数组,是具有相同数据类型的若干变量或者数据按照一定排序规则组合起来的一种数据存储格式。数组中的数据称为数组元素,我们使用索引来标识...
  • Java多维数组的内存分配

    千次阅读 2017-01-16 03:48:19
    什么是多维数组多维数组的本质还是1维数组,就是数组元素依然是数组的1维数组,比如2维数组是数组元素是1维数组的数组,3维数组是数组元素是2维数组的数组…….以此类推,N维数组是数组元素是N-1维数组的数组。示例...
  • 使用的教材是java核心技术卷1,我将跟着这本书的章节同时配合视频资源来进行学习基础java知识。 day010 数组 1.数组介绍 数组是一种数据结构,用来存储同一类型值的集合。通过一个整型下标可以访问数组中的每一个...
  • Java多维数组遍历

    2015-10-01 00:24:56
    多维数组 数组是Java中的一种容器对象,它拥有多个单一类型的值。当数组被创建的时候数组长度就已经确定了。在创建之后,其长度是固定的。下面是一个长度为10的数组: public class ArrayDemo { private int array...
  • Java多维数组详解

    2013-09-06 07:15:01
    java语言中,数组是一种最...数组有一维数组和多维数组。  ★ 一维数组   1. 一维数组的定义  type arrayName[ ];   类型(type)可以为Java中任意的数据类型,包括简单类型和复合类型。   例如:   
  • 文章目录Java数组1、数组声明创建与初始化2、内存分析3、多维数组4、Arrays类5、冒泡排序 面试常遇见6、稀疏数组 重点 压缩数组7、二分查找法(折半查找法) 面试常见 Java数组 数组是相同类型数据的有序集合。每个...
  • java多维数组遍历

    2015-10-05 12:56:22
    多维数组 数组是Java中的一种容器对象,它拥有多个单一类型的值。当数组被创建的时候数组长度就已经确定了。在创建之后,其长度是固定的。下面是一个长度为10的数组: 1 2 3 4 ...
  • java100例之实例3 演示一维数组和多维数组初始化和基本操作.rar

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 14,582
精华内容 5,832
关键字:

java多维数组初始化

java 订阅