Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Библиотека Trove. Коллекции простых типов в Java

Anna | 5.06.2014 | нет комментариев

В стандартной библиотеке Java отсутствует вероятность оперировать коллекциями простых типов, таких как int, long и т.д. Типовой выход — применять объекты классов Integer, Long и т.д.

Такой подход отлично работает на маленьком числе элементов, от того что, во-первых, при всякий операции происходит autoboxing/autounboxing и во-вторых, в коллекции хранятся ссылки на объекты в heap. Объекты в heap не только вносят добавочный overhead по памяти, но и создают нагрузку на GC.

Есть еще один неочевидный минус объектов в heap — кэширование в современных процессорах. Процессор загружает данные в кэш блоками. В случае последовательной обработки массива, в кэш загружается сразу несколько элементов. В случае же объектов разбросанных по heap, попаданий в кэш будет поменьше. Подробнее про кэширование и иерархию памяти тут.

Библиотека Trove представляет типовой интерфейс коллекций для работы с простыми типами. Для большинства использований, коллекции Trove работают стремительней и потребляют поменьше памяти.

В комплект коллекций входят:

В различии от jdk, в Hash’ах Trove применяется Open addressing способ разрешения коллизий.

Правило именования — T<Type><CollectionType>.
Скажем:
Интерфейс TIntList — List of int, реализация TIntArrayList:

TIntList l = new TIntArrayList();

Интерфейс TLongLongMap — Map c ключами long и значениями long, реализация TLongLongHashMap:

TLongLongMap m = new TLongLongHashMap();

В jdk коллекциях, в случае если элемент не обнаружен — возвращается null. В Trove возвращается «NoEntryValue», по умолчанию — 0. Узнать NoEntryValue, задать NoEntryValue дозволено при создании коллекции.

Плюсом коллекций Trove являются способы обработки — forEach,

    public static long troveEach() {
        final long [] rvalue = {0};
// troveMap - TLongLongHashMap
// TLongProcedure будет вызываться для всякого элемента коллекции, 
// пока не вернет false
// либо не кончатся элементы
        troveMap.forEachValue(new TLongProcedure() {
            @Override
            public boolean execute(long value) {
                rvalue[0]  = value;
                return true;
            }
        });
        return rvalue[0];
    }

grepinverseGrep — образование списка по условию (для TList…) и transformValues — inplace операции метаморфозы над элементами коллекции.

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB