Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:二维数组是按列主顺序还是按行主顺序存储的?_Java_Memory_Multidimensional Array_Performance - Fatal编程技术网

Java:二维数组是按列主顺序还是按行主顺序存储的?

Java:二维数组是按列主顺序还是按行主顺序存储的?,java,memory,multidimensional-array,performance,Java,Memory,Multidimensional Array,Performance,在Java中,多维数组是以列主顺序还是行主顺序存储的?两者都不是。在Java中,我们有时可能认为二维数组实际上是数组引用的数组。它不是线性存储在内存中的 Java语言规范在引言中指出了这一点: 该语言支持数组的数组,而不是多维数组 int[ ][ ] table; table = new int[3][ ]; table[0] = new int[5]; table[1] = new int[5]; table[2] = new int[5]; 这有几个含义 数组的数组可以是--成员

在Java中,多维数组是以列主顺序还是行主顺序存储的?

两者都不是。在Java中,我们有时可能认为二维数组实际上是数组引用的数组。它不是线性存储在内存中的

Java语言规范在引言中指出了这一点:

该语言支持数组的数组,而不是多维数组

int[ ][ ] table;

table = new int[3][ ];

table[0] = new int[5];

table[1] = new int[5];

table[2] = new int[5];
这有几个含义

  • 数组的数组可以是--成员数组可以有不同的长度
  • 外部数组的成员是引用,可以为null
  • 克隆外部数组是浅层的——成员数组在原始数组和克隆数组之间共享
从:

数组类型的单个变量可能包含对不同长度数组的引用,因为数组的长度不是其类型的一部分

从:

多维数组的克隆是浅层的,也就是说它只创建一个新数组。子阵列是共享的


Java没有多维数组。它有数组的数组。那么比如说,

int[][]
…是
int[]
的数组(当然
int[]
int
的数组)

因此,Java既不是列主顺序,也不是行主顺序(但请参见下面关于如何读取
a[2][3]
),因为当给定数组的条目存储在连续的内存块中时,这些条目指向的从属数组是对完全分离的、不相关的内存块的对象引用。这也意味着Java的数组本身是参差不齐的:
[0]
处的条目可能指3插槽数组,
[1]
处的条目可能指4插槽数组,
[2]
可能根本不指数组(它可能有
null
),或者
[3]
指6插槽数组

一张图片抵得上1k-24个单词以及所有这些:

+−−−−−−−−+ +−−−−>| int[] | +−−−−−−−−−−−+ | +−−−−−−−−+ | int[][] | | | 0: int | +−−−−−−−−−−−+ | | 1: int | | 0: int[] |−−−−−−+ | 2: int | | 1: int[] |−−−−−−+ +−−−−−−−−+ | 2: null | | | 3: int[] |−−+ | +−−−−−−−−+ +−−−−−−−−−−−+ | +−−−−>| int[] | | +−−−−−−−−+ | | 0: int | | | 1: int | | | 2: int | | | 3: int | | +−−−−−−−−+ | | +−−−−−−−−+ +−−−−−−−−−| int[] | +−−−−−−−−+ | 0: int | | 1: int | | 2: int | | 3: int | | 4: int | | 5: int | +−−−−−−−−+ +−−−−−−−−+ +−−−−>| int[]| +−−−−−−−−−−−+ | +−−−−−−−−+ |int[][]| | | 0:int| +−−−−−−−−−−−+ | | 1:int| |0:int[]|−−−−−−+ | 2:int| |1:int[]|−−−−−−+ +−−−−−−−−+ |2:null|| |3:int[]|−−+ | +−−−−−−−−+ +−−−−−−−−−−−+ | +−−−−>| int[]| | +−−−−−−−−+ || 0:int| || 1:int| || 2:int| || 3:int| | +−−−−−−−−+ | | +−−−−−−−−+ +−−−−−−−−−| int[]| +−−−−−−−−+ |0:int| |1:int| |2:int| |3:int| |4:int| |5:int| +−−−−−−−−+
一旦你知道了这一点,你就知道(比如说)
a[2][3]
的意思是“获取
a
的索引
2
处的条目所引用的数组,然后获取该从属数组的索引
3
所引用的条目。”我认为它相当类似于行的主顺序,但这并不完全相同。

在Java中,只有一维数组

int[ ][ ] table;

table = new int[3][ ];

table[0] = new int[5];

table[1] = new int[5];

table[2] = new int[5];
二维数组基本上只是一维数组中的一维数组

int[ ][ ] table;

table = new int[3][ ];

table[0] = new int[5];

table[1] = new int[5];

table[2] = new int[5];

你确定吗?我认为这是行的主要顺序,这很相似,因为特定行中的列是连续存储的。但是,行本身不是连续存储的。C中的2D数组是一个内存块。了解数据是按行主顺序还是按列主顺序放置在该块中可能很重要。但是在一维数组中,只有一种布局。Java实际上没有2d数组,尽管它的一维数组可以为2d效果保存对其他数组的引用。所以这个问题对Java来说没有意义。我删除了关于C、Matlab等的参考资料,并在主体部分重复了这个问题。我希望现在我的问题清楚了。投票重开。“很难说出这里要问什么”——真的吗?我非常清楚。我们甚至得到了三个很好的答案。为什么这个问题是封闭的?遇到这些完全有效、有意义的封闭式问题让我感到困惑。比我的答案更完整+1.Java在内存存储方面没有多维数组——但JLS本身将Java的数组松散地称为“多维数组”。谢谢你的回答,T.J.Crowder。所以,我想按行主顺序扫描一维数组更有效。@Zouzias:可能吧。并缓存对行的引用,因为它是对象引用。例如,在Java中,
a=x[3][2]表示
y=x[3];a=y[2]a=x[3][2]意味着
a=*(x+(3*2))所以你想做一次
y=x[3]
并保留对它的引用(尽管一些JVM——例如Sun/Oracle的HotSpot——非常擅长为你做这件事)。Java中锯齿数组的解释非常好,是的,我同意Java数组与C数组不同,在分配时不需要任何顺序。它只是以递归的方式被认为是数组中的数组,等等。