HashSet из ByteBuffer (фактически целые числа) для отделения уникальных и неуникальных элементов от массива ByteBuffer - PullRequest
0 голосов
/ 18 марта 2011

У меня есть массив ByteBuffer s (которые фактически представляют целые числа). Я хочу, чтобы отдельные уникальные и не уникальные ByteBuffers (т.е. целые числа) в массиве. Таким образом я использую HashSet этого типа:
HashSet<ByteBuffer> columnsSet = new HashSet<ByteBuffer>()

Просто хотел узнать, является ли HashSet хорошим способом сделать это? И оплачиваю ли я больше расходов при ByteBuffer, чем если бы я сделал это за Integer?

(На самом деле я читаю сериализованные данные из БД, которые необходимо записать обратно после этой операции, поэтому я хочу избежать сериализации и десериализации между байтовым буфером в Integer и обратно!)

Ваши мысли по этому поводу оценены.

Ответы [ 3 ]

1 голос
/ 18 марта 2011

Создание ByteBuffer намного дороже, чем чтение / запись из повторно использованного ByteBuffer.

Наиболее эффективный способ хранения целых чисел - использовать тип int. Если вам нужен набор из них, вы можете использовать TIntHashSet, который использует примитивы int. Вы можете выполнить несколько операций чтения / десериализации / сохранения и выполнить обратное преобразование с помощью предварительно выделенных объектов O (1).

0 голосов
/ 18 марта 2011
Коллекции

обычно работают с методами equals() и hashCode(), поэтому влияние на производительность может оказать реализация объектов, хранящихся в коллекции.

Глядя на ByteBuffer и Integer, можно увидеть, что реализация этих методов в Integer проще (всего одно сравнение int для equals() и return value; для hashCode()). Таким образом, можно сказать, что стоимость Set<ByteBuffer> выше, чем у Set<Integer>.

Однако я не могу вам сейчас сказать, выше ли эта стоимость затрат на сериализацию и десериализацию.

На самом деле, я бы просто выбрал более читаемый код, если у вас действительно нет проблем с производительностью. В этом случае я бы просто попробовал оба метода и выбрал более быстрый.

0 голосов
/ 18 марта 2011

Прежде всего, это будет работать.Издержки equals() на двух ByteBuffer с определенно будут выше, но, возможно, их недостаточно, чтобы компенсировать преимущества отсутствия десериализации (хотя я не совсем уверен, будет ли это такой большой проблемой).

Я почти уверен, что асимптотически производительность будет одинаковой, но более эффективное решение - отсортировать массив, затем линейно пройти по нему и проверить последовательные элементы на равенство.

Например, предположим, что ваши буферы содержат следующее:

1 2 5 1

Сортировка:

1 1 2 5

Как только вы начинаете итерацию, вы получаете ar[0].equals(ar[1]), и вы знаете, что это дубликаты.Просто продолжай в том же духе до n-1.

...