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()的问题。谢谢你的建议!