2013-05-24 2 views
1

Я новичок в Java, и я не знаю различий между реализациями Java-коллекции.Какую коллекцию я должен использовать, чтобы проверить, находится ли значение в коллекции элементов 100K?

Мне нужно обработать до 100 тыс. Записей импортированных данных. В этом списке могут быть дубликаты. Я должен положить все это в БД. Перед импортом я очищаю таблицу базы данных, поэтому вначале нет дубликатов в БД.

A am a batch inserting data with hibernate. Я хочу сделать что-то вроде этого:

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

http://docs.oracle.com/javase/6/docs/api/java/util/HashSet.html – planetjones

+0

Что сказал planetjones. Кроме того, вы должны использовать 'hashCode()', если он гарантированно отличается для каждого объекта. В противном случае вы можете получить ложные срабатывания в 'contains()'. – ddmps

+2

@ Pescis: это просто неправильно. Прочтите javadoc HashSet, equals и hashCode. –

ответ

1

Если записи являются сортируются вы можете использовать коллекцию TreeSet, которая будет автоматически Удалять все дубликаты записей при условии, что они имеют реализована действительная compareTo() и equals() методы.

Эта коллекция также provides guaranteed log(n) time cost for the basic operations (add, remove and contains).[reference]

Если у вас есть доступ к функции hashCode(), то вы можете использовать HashSet. Он будет работать так же, как TreeSet (обрезки обложек при вставке), и он будет быстрее.

Colsult Hashset vs Treeset вопрос для получения дополнительной информации об обеих этих коллекциях.

Если возможно, используйте HashSet.

+2

Я думаю, что HashSet быстрее, потому что он обеспечивает доступ к [постоянному времени] (http://en.wikipedia.org/wiki/Time_complexity#Constant_time). –

+0

@beto thx, вы правы! изменил ответ. – Dariusz

+0

Я хочу хранить только Целочисленные идентификаторы, а не целые объекты, которые фактически генерируются с помощью метода '.hashCode()'. Кажется, что TreeSet - это путь. – SWilk

2

Вы можете попробовать: HashSet. Помните, что класс содержащихся объектов должен правильно реализовать методы hashCode() и equals().

1

Если вы не хотите дубликаты, вы можете использовать

Set<Integer> alreadyInsertedRecords = new HashSet<Integer>() 
0

Я бы не использовать коллекцию для этого, как это может быть сделано на уровне базы данных. Вы можете использовать инструкцию insert, где не существует.

Например

insert into people (firstName, lastName) 
select 'Foo', 'Bar' 
where not exists (
    select 1 from people where firstName = 'Foo' and lastName = 'Bar' 
) 
+0

Вам не кажется, что проверка того, является ли данный объект дубликатом в памяти приложения, более эффективна с точки зрения производительности, а затем вызывает запрос базы данных? –

+0

Пока индексируется столбец, это то же самое. Это просто просмотр индекса java и поиск индекса базы данных. Оба должны быть постоянным временем O (1) –

+0

На самом деле, думая об этом снова, вы правы. Есть дополнительный сетевой трафик. Но бонус - вам не нужно хранить 100 000 записей в памяти в JVM –

Смежные вопросы