可能有数百个关于 Java 集合与数组的问题,但这是我真的没想到的。
我正在为我的游戏开发一个服务器,为了在客户端和服务器之间进行通信,你需要发送数据包(显然),所以我做了一些测试,我可以最好地使用哪个 Collection(或数组)来处理它们,HashMap、ArrayList 和一个PacketHandler 数组。结果出乎我的意料,因为 ArrayList 获胜。
数据包处理结构就像字典的使用(PacketHandler 的索引),因为数组是字典使用的最原始形式,我认为它比 ArrayList 更容易执行。有人可以解释一下为什么会这样吗?
我的测试
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Random;
public class Main {
/**
* Packet handler interface.
*/
private interface PacketHandler {
void handle();
}
/**
* A dummy packet handler.
*/
private class DummyPacketHandler implements PacketHandler {
@Override
public void handle() { }
}
public Main() {
Random r = new Random();
PacketHandler[] handlers = new PacketHandler[256];
HashMap<Integer, PacketHandler> m = new HashMap<Integer, PacketHandler>();
ArrayList<PacketHandler> list = new ArrayList<PacketHandler>();
// packet handler initialization
for (int i = 0; i < 255; i++) {
DummyPacketHandler p = new DummyPacketHandler();
handlers[i] = p;
m.put(new Integer(i), p);
list.add(p);
}
// array
long time = System.currentTimeMillis();
for (int i = 0; i < 10000000; i++)
handlers[r.nextInt(255)].handle();
System.out.println((System.currentTimeMillis() - time));
// hashmap
time = System.currentTimeMillis();
for (int i = 0; i < 10000000; i++)
m.get(new Integer(r.nextInt(255))).handle();
System.out.println((System.currentTimeMillis() - time));
// arraylist
time = System.currentTimeMillis();
for (int i = 0; i < 10000000; i++)
list.get(r.nextInt(255)).handle();
System.out.println((System.currentTimeMillis() - time));
}
public static void main(String[] args) {
new Main();
}
}
我觉得问题已经解决了,谢谢大家