В ответ на подразумеваемый, но другой вопрос;
В: У вас есть 1 миллиард телефонных номеров, и вам нужно отправлять их через соединение с низкой пропускной способностью. Вам нужно только отправить, находится ли номер телефона в коллекции или нет. (Другая информация не требуется)
О: Это общий подход.
- Сначала отсортируйте список, если он еще не отсортирован.
- Из наименьшего числа найдите области непрерывных чисел. Пришлите стартовый регион и телефоны какие заняты. Это может быть сохранено в виде набора битов (1 бит на возможный номер). Отправляйте номер телефона в начале и набор битов всякий раз, когда разрыв превышает некоторый порог.
- Запишите поток в сжатый набор данных.
- Протестируйте это, чтобы сравнить с простой отправкой всех номеров.
Вы можете использовать строки в отсортированном TreeMap. Один миллион номеров - это не так уж и много, и он займет около 64 МБ. Не вижу необходимости в более сложном решении.
Последняя версия Java может эффективно хранить текст ASCII, используя byte[] вместо char[], однако накладные расходы вашей структуры данных, вероятно, будут больше.
Если вам нужно сохранить номера телефонов в качестве ключа, вы можете хранить их с предположением, что большие диапазоны будут непрерывными. Таким образом, вы можете хранить их как
NavigableMap<String, PhoneDetails[]>
В этой структуре ключ будет определять начало диапазона, и у вас может быть информация о телефоне для каждого номера. Это может быть не намного больше, чем ссылка на PhoneDetails (что является минимумом).
Кстати: вы можете изобретать очень эффективные структуры, если вам не нужен доступ к данным. Если вы никогда не обращаетесь к данным, не храните их в памяти, на самом деле вы можете просто отказаться от них, так как они никогда не понадобятся.
Многое зависит от того, что вы хотите делать с данными и почему они вообще у вас в памяти.
Вы можете использовать DeflatorOutputStream для ByteArrayOutputStream, который будет очень маленьким, но не очень полезным.
Я предлагаю использовать DeflatorOutputStream, так как он легче/быстрее/меньше, чем GZIPOutputStream.
09.05.2011