Java中的性能:在哪里可以创建指向更大阵列的一部分的子阵列?
学习Java,请温柔一点。理想情况下,我需要创建一个字节数组,该数组将指向更大数组的一部分:
byte[] big = new byte[1000];
// C-style code starts
load(file,big);
byte[100] sub = big + 200;
// C-style code ends
我知道这在Java中是不可能的,我想到了两种解决方法,包括:
将big的部分复制到sub中,并在big中迭代
或者编写自己的类,该类将引用big+offset+size,并通过使用big作为实际底层数据结构的访问器方法实现“子数组”
我试图解决的任务是将文件加载到内存中,然后通过类以只读方式访问与文件一起存储的记录。速度是最重要的,因此理想情况下我希望避免复制或访问方法。既然我在学习Java,我想坚持下去
我还有别的选择吗?如果我没有很好地解释任务,请一定提问
# 1 楼答案
如果你想快速、低级别地读取一个文件,可以查看JavaNIO。这里有一个来自java almanac的例子
可以使用映射字节缓冲区在文件内容中导航
# 2 楼答案
看看java的源代码。String(它将在src.zip或src.jar中)。你会看到他们有一个CAHR数组,然后是一个开始和结束。所以,是的,解决方案是使用一个类来完成
Here is a link to the source online
感兴趣的变量包括:
子字符串可能是一个很好的起点
如果您想从文件中直接读取,请使用java.nio.channels.FileChannel类,特别是map()方法,这将允许您使用内存映射I/O,这将非常快,并且比复制到数组使用更少的内存
# 3 楼答案
在Java中,创建一个数组作为另一个数组的“视图”是不可能的。但是你可以使用java.nio.ByteBuffer,这基本上就是你在《解决#2》中建议的类。例如:
不需要复制(不过需要创建一些对象)。作为一个标准的图书馆类,我还假设ByteBuffer更有可能接受特殊待遇wrt。JVM的“JIT”优化比定制优化更有效