Java 性能:从头开始创建集合,还是迭代并添加缺少的?(爪哇)
一个快速问题:性能方面还是编程方面,哪一个更可取: 情况: 数据库中有一个表,其中包含有关对象的信息,例如: 表Java 性能:从头开始创建集合,还是迭代并添加缺少的?(爪哇),java,collections,Java,Collections,一个快速问题:性能方面还是编程方面,哪一个更可取: 情况: 数据库中有一个表,其中包含有关对象的信息,例如: 表Car包含列Id(主键),品牌,颜色 您有一个程序可以显示数据库中有关汽车的信息。您可以选择一个品牌,它会显示该品牌的所有汽车。执行对数据库的调用以获取此信息。显示的每辆车都会在程序中生成具有相应属性的对象car,并添加到集合CarCollection(ArrayList)。下次您需要有关特定汽车的信息时,程序首先检查汽车是否在收藏中。如果不是这样,则会调用数据库 因此,您最终拥有了一
Car
包含列Id
(主键),品牌
,颜色
您有一个程序可以显示数据库中有关汽车的信息。您可以选择一个品牌
,它会显示该品牌的所有汽车。执行对数据库的调用以获取此信息。显示的每辆车都会在程序中生成具有相应属性的对象car
,并添加到集合CarCollection
(ArrayList)。下次您需要有关特定汽车的信息时,程序首先检查汽车是否在收藏中。如果不是这样,则会调用数据库
因此,您最终拥有了一批汽车。现在我想显示数据库中所有的汽车。它们可能都已经在CarCollection
中,但这并不确定
更可取的是:
- 使用查询选择所有
车辆
,清除现有车辆集合的内容
,然后从头开始填充集合
- 使用查询选择所有
车辆
,遍历车辆集合
和数据库结果,并添加缺少的车辆
- 使用仅选择不在集合中的
车辆的查询,然后添加这些车辆
额外注意:Collection.contains()只生成false,它无法识别列表中的对象与集合中的对象相同(即使是这种情况)。
另一个额外的注意事项:收集背后的想法是最小化对数据库的调用。如果对象已在集合中,则不再需要数据库调用
当然,我们也欢迎对完全不同的方法提出建议
Collection.contains()
然后您可能需要覆盖对象上的equals和hashcode
收集的想法是尽量减少对数据库的调用
假设您的对象有一个id,为什么不调用
SELECT ... FROM ... WHERE id NOT IN (<the list of ids that you already have>)
选择。。。从…起其中id不在()
?您需要更清楚地表述需求。很容易找到丢失的物体
这里的第一点是如何定义对象。表示您将如何唯一地标识对象。然后实现define equals()和hashcode()方法
public class Entity{
private int id;
......
.......
public boolean equals(Object obj){
if(!(obj instanceof Entity)){
return false;
}
EntityObj eobj = (Entity)obj;
return (id==eobj.id);
}
public int hashcode(){
return id; //Any hashing function is fine
}
}
一旦定义了对象。您只需要从数据库中获取所有元素,并与集合元素进行比较,找到缺少的元素
根据您的要求,需要使用集合进行搜索。如果是列表接口,则需要迭代它们非常耗时。对于任何搜索,最好使用哈希函数进行快速搜索。尝试更清楚地表述您的要求。此外,这可能取决于集合的类型(哈希集与arraylist具有非常不同的性能特征…),我添加了一个示例来阐明我的意思。我希望这是更清楚!我不知道为什么,但我脑子里的这个小虫子一直在问:“他为什么不直接使用呢?”这是个好问题,我没想到。您的另一个建议也是我忽略的,我将其添加到我的帖子中。重写equals确实解决了Collection.contains()的问题。谢谢你的建议!