一般来说,没有好的方法可以强制队列中的对象占用一块连续的内存。但是,有些技术适用于特殊情况。
在高层次上,这些技术涉及使用字节数组和从数组中“序列化”数据。如果您要存储非常简单的对象,这实际上非常有效。例如,如果您要存储一堆 2D 点 + 权重,您可以简单地写入权重、x 坐标、y 坐标的字节等效值。
当然,此时的问题在于在查看/弹出时分配实例。您可以通过使用回调来避免这种情况。
请注意,即使在存储的对象本身很复杂的情况下,使用与此类似的技术,您可以为权重保留一个数组,为实际对象保留一个单独的引用数组,这样您就可以避免遵循对象引用,直到绝对必要为止。
回到存储简单不可变值类型的方法,这是您可以做什么的不完整草图:
abstract class LowLevelPQ<T> {
interface DataHandler<R, T> {
R handle(byte[] source, int startLoc);
}
LowLevelPQ(int entryByteSize) { ... }
abstract encode(T element, byte[] target, int startLoc);
abstract T decode(byte[] source, int startLoc);
abstract int compare(byte[] data, int startLoc1, int startLoc2);
abstract <R> R peek(DataHandler<R, T> handler) { ... }
abstract <R> R pop(DataHandler<R, T> handler) { ... }
}
class WeightedPoint {
WeightedPoint(int weight, double x, double y) { ... }
double weight() { ... }
double x() { ... }
...
}
class WeightedPointPQ extends LowLevelPQ<WeightedPoint> {
WeightedPointPQ() {
super(4 + 8 + 8); // int,double,double
}
int compare(byte[] data, int startLoc1, int startLoc2) {
// relies on Java's big endian-ness
for (int i = 0; i < 4; ++i) {
int v1 = 0xFF & (int) data[startLoc1];
int v2 = 0xFF & (int) data[startLoc2];
if (v1 < v2) { return -1; }
if (v1 > v2) { return 1; }
}
return 0;
}
...
}