1

我是 Java 新手,我不知道 Java 集合实现之间的区别。

我必须处理多达 10 万条导入数据的记录。该列表中可能有重复项。我必须把所有这些都放到数据库中。在导入之前我清理了数据库表,所以一开始在 DB 中没有重复。

使用休眠模式批量插入数据。我想做这样的事情:

SomeCollectionClass<Integer> alreadyInsertedRecords;
//...
if (!alreadyInsertedRecords.contains(currentRecord.hashCode()) {
    save_to_database(currentRecord);
    alreadyInsertedRecords.put(currentRecord.hashCode());
} else {
    logger.log("Record no 1234 is a duplicate, skipping");
}

我应该使用哪个集合类来检查记录是否已插入数据库?

正如我所说,可能有超过 100 000 条记录,因此集合应该快速搜索、快速插入并且具有较小的内存占用。

4

4 回答 4

2

您可以尝试使用HashSet。请记住,包含对象的类必须正确实现方法 hashCode() 和 equals()。

于 2013-05-24T10:36:05.490 回答
1

如果条目是可排序的,您可以使用该TreeSet集合,该集合将自动修剪所有重复条目,前提是它们具有有效compareTo()且已equals()实施的方法。

此合集还provides guaranteed log(n) time cost for the basic operations (add, remove and contains). [参考]

如果您有权访问该hashCode()功能,那么您可以使用HashSet. 它的工作方式与 TreeSet 类似(插入时修剪欺骗),并且速度会更快。

Colsult Hashset vs Treeset问题,了解这两个集合的详细信息。

如果可能,请使用HashSet.

于 2013-05-24T10:36:36.000 回答
1

如果你不想重复,你可以使用

Set<Integer> alreadyInsertedRecords = new HashSet<Integer>()
于 2013-05-24T10:39:13.257 回答
0

我不会为此使用集合,因为它可以在数据库级别完成。您可以使用 insert where not exists 语句。

例如

insert into people (firstName, lastName) 
select 'Foo', 'Bar'
where not exists (
    select 1 from people where firstName = 'Foo' and lastName = 'Bar'
)
于 2013-05-24T10:45:55.307 回答