当前位置: 首页 > 面试题库 >

Java:多维数组与一维数组

公西飞鸾
2023-03-14
问题内容

例如:

  • 一个) int [x][y][z]

  • b) int[x*y*z]

最初以为我会为了简化而选择a)。

我知道Java不会像C那样在内存中线性存储数组,但是这对我的程序有什么影响?


问题答案:

通常,在搜索答案时,最好的办法是查看如何将选择编译到JVM字节码中:

multi = new int[50][50];
single = new int[2500];

这被翻译成:

BIPUSH 50
BIPUSH 50
MULTIANEWARRAY int[][] 2
ASTORE 1
SIPUSH 2500
NEWARRAY T_INT
ASTORE 2

因此,如您所见,JVM已经知道我们在谈论多维数组。

进一步说明:

for (int i = 0; i < 50; ++i)
    for (int j = 0; j < 50; ++j)
    {
        multi[i][j] = 20;
        single[i*50+j] = 20;
    }

这被转换为(跳过循环):

ALOAD 1: multi
ILOAD 3: i
AALOAD
ILOAD 4: j
BIPUSH 20
IASTORE

ALOAD 2: single
ILOAD 3: i
BIPUSH 50
IMUL
ILOAD 4: j
IADD
BIPUSH 20
IASTORE

因此,如您所见,多维数组在VM内部进行处理,无用指令不会产生开销,而单条指令会使用更多指令,因为偏移是手动计算的。

我认为性能不会成为问题。

编辑:

我做了一些简单的基准测试,看看这里发生了什么。我选择尝试不同的示例:线性读取,线性写入和随机访问。时间以毫秒表示(并使用进行计算System.nanoTime()。结果如下:

线性写入

  • 尺寸:100x100(10000)
    • 多:5.786591
    • 单身:6.131748
  • 尺寸:200x200(40000)
    • 多:1.216366
    • 单身:0.782041
  • 尺寸:500x500(250000)
    • 多:7.177029
    • 单身:3.667017
  • 尺寸:1000x1000(1000000)
    • 多:30.508131
    • 单身:18.064592
  • 尺寸:2000x2000(4000000)
    • 多:185.3548
    • 单身:155.590313
  • 尺寸:5000x5000(25000000)
    • 多:955.5299
    • 单身:923.264417
  • 尺寸:10000x10000(100000000)
    • 多:4084.798753
    • 单身:4015.448829

线性读取

  • 尺寸:100x100(10000)
    • 多:5.241338
    • 单身:5.135957
  • 尺寸:200x200(40000)
    • 多:0.080209
    • 单身:0.044371
  • 尺寸:500x500(250000)
    • 多:0.088742
    • 单身:0.084476
  • 尺寸:1000x1000(1000000)
    • 多:0.232095
    • 单身:0.167671
  • 尺寸:2000x2000(4000000)
    • 多:0.481683
    • 单身:0.33321
  • 尺寸:5000x5000(25000000)
    • 多:1.222339
    • 单身:0.828118
  • 尺寸:10000x10000(100000000)
    • 多:2.496302
    • 单身:1.650691

随机读取

  • 尺寸:100x100(10000)
    • 多:22.317393
    • 单身:8.546134
  • 尺寸:200x200(40000)
    • 多:32.287669
    • 单身:11.022383
  • 尺寸:500x500(250000)
    • 多:189.542751
    • 单身:68.181343
  • 尺寸:1000x1000(1000000)
    • 多:1124.78609
    • 单身:272.235584
  • 尺寸:2000x2000(4000000)
    • 多:6814.477101
    • 单身:1091.998395
  • 尺寸:5000x5000(25000000)
    • 多:50051.306239
    • 单身:7028.422262

随机数有点误导,因为它为多维数组生成2个随机数,而为一维数组生成一个随机数(并且PNRG可能会消耗一些CPU)。

请记住,我试图通过在同一循环的第20次运行之后进行基准测试来使JIT正常工作。为了完整起见,我的Java VM是以下内容:

Java版本“ 1.6.0_17” Java SE运行时环境(内部版本1.6.0_17-b04)Java
HotSpot(TM)64位服务器VM(内部版本14.3-b01,混合模式)



 类似资料:
  • 除了一维数组和二维数组外, Java 中还支持更多维的数组,如三维数组、四维数组和五维数组等,它们都属于多维数组。经过前面一维,二维的练习后不难发现,想要提高数组的维数,只要在声明数组时将索引与中括号再加一组即可,所以三维数组的声明为 int score[][][],而四维数组为 int score[][][][],以此类推。 通常也将二维数组看作是多维数组。本文以三维数组为例来介绍多维数组。 三

  • 主要内容:创建一维数组,分配空间,初始化一维数组,获取单个元素,获取全部元素当数组中每个元素都只带有一个下标时,这种数组就是“一维数组”。一维数组(one-dimensional array)实质上是一组相同类型数据的线性集合,是数组中最简单的一种数组。 数组是引用数据类型,引用数据类型在使用之前一定要做两件事情:声明和初始化。所以本文将重点介绍一维数组的创建、初始化和使用。 创建一维数组 为了在程序中使用一个数组,必须声明一个引用该数组的变量,并指明整个变量可以引用的数

  • MATLAB中的多元数组MATLAB是下标多于两个的数组。可以调用带有两个以上变元的zeros, ones, rand, 或randn函数来产生。例如, R = randn(3,4,5); 生成一个3*4*5的数组,共有3x4x5 = 60个正态分布的随机元素。 三维数组可能表示三维物理数据,譬如房间的温度,取样于一个长方形网格。或者,可表示一个矩阵序列A(k),或依赖时间变化的矩阵A(t)。在

  • 问题内容: 我有一个基于行的多维数组: 我想将此数组转换为基于列的数组,如下所示: …但是我真的不知道从哪里开始 问题答案: 试试这个: 输出:

  • 问题内容: 我正在开发一个使用数据库类查询mySQL的php应用程序。 该类在这里:http : //net.tutsplus.com/tutorials/php/real-world-oop-with-php-and- mysql/ 我根据自己的需要对课程进行了一些调整,但存在一个问题(可能是一个愚蠢的问题) 使用select()时,它返回一个多维数组,类似于具有3个cols(id,firstn

  • 主要内容:1、二维数组,2、初始化二维数组,3、访问二维数组种的元素C# 中同样支持多维数组(也可称为矩形数组),它可以是二维的,也可以是三维的,多维数组中的数据以类似表格(行、列)的形式存储,因此也被称为矩阵。 要创建多维数组,我们需要在声明数组的方括号内添加逗号,例如: int[,] arr=new int[3,3];         // 声明一个二维数组 int[,,] arr=new int[3,3,3];     // 声明一个三维数组  1、二维数组