有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java中的性能:在哪里可以创建指向更大阵列的一部分的子阵列?

学习Java,请温柔一点。理想情况下,我需要创建一个字节数组,该数组将指向更大数组的一部分:

byte[] big  = new byte[1000];

// C-style code starts
load(file,big);

byte[100] sub = big + 200; 

// C-style code ends

我知道这在Java中是不可能的,我想到了两种解决方法,包括:

  1. big的部分复制到sub中,并在big中迭代

  2. 或者编写自己的类,该类将引用big+offset+size,并通过使用big作为实际底层数据结构的访问器方法实现“子数组”

我试图解决的任务是将文件加载到内存中,然后通过类以只读方式访问与文件一起存储的记录。速度是最重要的,因此理想情况下我希望避免复制或访问方法。既然我在学习Java,我想坚持下去

我还有别的选择吗?如果我没有很好地解释任务,请一定提问


共 (3) 个答案

  1. # 1 楼答案

    如果你想快速、低级别地读取一个文件,可以查看JavaNIO。这里有一个来自java almanac的例子

    可以使用映射字节缓冲区在文件内容中导航

  2. # 2 楼答案

    看看java的源代码。String(它将在src.zip或src.jar中)。你会看到他们有一个CAHR数组,然后是一个开始和结束。所以,是的,解决方案是使用一个类来完成

    Here is a link to the source online

    感兴趣的变量包括:

    • 价值观
    • 抵消

    子字符串可能是一个很好的起点

    如果您想从文件中直接读取,请使用java.nio.channels.FileChannel类,特别是map()方法,这将允许您使用内存映射I/O,这将非常快,并且比复制到数组使用更少的内存

  3. # 3 楼答案

    在Java中,创建一个数组作为另一个数组的“视图”是不可能的。但是你可以使用java.nio.ByteBuffer,这基本上就是你在《解决#2》中建议的类。例如:

    ByteBuffer subBuf = ByteBuffer.wrap(big, 200, 100).slice().asReadOnlyBuffer();
    

    不需要复制(不过需要创建一些对象)。作为一个标准的图书馆类,我还假设ByteBuffer更有可能接受特殊待遇wrt。JVM的“JIT”优化比定制优化更有效