好吧,如果一次将所有表数据保存在内存中很重要,那么存储数据结构的方向(作为映射列表或列表映射)不会有太大区别。地图列表显然更直观,所以我会保留它。
如果您担心对象创建和清理的效率,我建议您使用对象池。这是它如何工作的基本想法:
public class TableRowPool {
private static final int INITIAL_CAPACITY = 10000;
private Queue<Map<String, Object>> mapObjects;
public TableRowPool() {
mapObjects = new LinkedList<Map<String, Object>>();
for(int i = 0; i < INITIAL_CAPACITY; i++) {
mapObjects.add(new HashMap<String, Object>());
}
}
public Map<String, Object> getTableRowObject() {
if(mapObjects.size() == 0) {
mapObjects.add(new HashMap<String, Object>());
}
return mapObjects.remove();
}
public void returnTableRowObject(Map<String, Object> obj) {
mapObjects.add(obj);
}
}
LinkedList 作为一个队列执行得很好,所以对象检索会很快。如果您希望它动态增长,它还可以快速添加新对象。但是,您可能需要更改数据结构,具体取决于它是否需要是线程安全的。
要使用对象池,您可以执行以下操作:
//Load data
while((row = getResultSetRow()) != null) {
Map<String, Object> rowObj = tableRowPool.getTableRowObject();
//Fill in data
myRows.add(rowObj);
}
//... Do all your business logic ...
//Cleanup
for(Map<String, Object> rowObj : myRows) {
tableRowPool.returnTableRowObject(rowObj);
}
myRows = null;