Вы можете посмотреть эту статью для получения дополнительной информации:
http://download -llnw.oracle.com / javase / tutorial / collection / interfaces / set.html
Как уже упоминалось, removeAll()
создан для этого, но вы захотите сделать это дважды, чтобы вы могли создать список всего, чего не хватает в обоих, и затем вы можете объединить эти два результата, чтобы получитьсписок всех различий.
Но это разрушительная операция, поэтому, если вы не хотите потерять информацию, скопируйте Set
и поработайте с ней.
ОБНОВЛЕНИЕ:
Похоже, мое предположение о том, что находится в массиве, неверно, поэтому removeAll()
не будет работать, но с требованием 5 мс, в зависимости от количества элементовпоиск может быть проблемой.
Таким образом, может показаться, что HashMap<String, Animal>
будет лучшим вариантом, поскольку он быстр в поиске.
Animal - это интерфейс с хотя бы одним свойствомString name
.Для каждого класса, который реализует Animal
, напишите код для Equals
и hashCode
.Вы можете найти некоторые обсуждения здесь: http://www.ibm.com/developerworks/java/library/j-jtp05273.html. Таким образом, если вы хотите, чтобы хеш-значение было комбинацией типа животного и имени, тогда это будет хорошо.
Итак, основнойАлгоритм состоит в том, чтобы хранить все в хэш-картах, а затем искать различия, просто получить массив ключей и выполнить поиск, чтобы выяснить, содержится ли этот ключ в другом списке, и если он не помещен в List<Object>
, сохраняя значение там.Вы захотите сделать это дважды, поэтому, если у вас есть по крайней мере двухъядерный процессор, вы можете получить некоторую выгоду от того, что оба поиска выполняются в отдельных потоках, но тогда вы захотите использовать один из одновременных добавленных типов данных.в JDK5, чтобы вам не приходилось беспокоиться о синхронизации в комбинированном списке различий.
Итак, я бы сначала написал его как однопотоковый и тестовый, чтобы получить представление о том, насколько быстрееэто также, сравнивая это с первоначальным воплощением.Затем, если вам это нужно быстрее, попробуйте использовать потоки, еще раз, сравните, чтобы увидеть, есть ли увеличение скорости.
Перед проведением какой-либо оптимизации убедитесь, что у вас есть некоторые показатели того, что у вас уже есть, чтобы вы могли сравнитьи посмотрим, приведет ли одно изменение к увеличению скорости.
Если вы вносите слишком много изменений за раз, у одного может быть значительное улучшение скорости, но другие могут привести к снижению производительности, и это не будет видно, поэтому каждое изменение должно быть однимза один раз.
Не теряйте другие реализации, хотя, используя модульные тесты и тестирование, возможно, 100 раз каждый, вы можете понять, какое улучшение дает каждое изменение.