net.ranides.assira.collection.list
Class NativeArrayList<T>

java.lang.Object
  extended by java.util.AbstractCollection<E>
      extended by java.util.AbstractList<T>
          extended by net.ranides.assira.collection.list.NativeArrayList<T>
Type Parameters:
T -
All Implemented Interfaces:
Iterable<T>, Collection<T>, List<T>, RandomAccess

public class NativeArrayList<T>
extends AbstractList<T>
implements RandomAccess

Lista odwzorowująca tablicę elementów typu prostego (int, float, etc) dokonując jedynie po drodze koniecznego autoboxingu.

Utworzona lista posiada maksymalną pojemność wyliczoną na podstawie długości prezentowanej tablicy (patrz: capacity). Rozmiar listy nie ma bezpośredniego związku z długością tablicy i może mieć dowolną wartość z zakresu [0;capacity]. Rozmiar listy może być modyfikowany: wszystkie operacje usuwania i wstawiania są obsługiwane tak długo, jak długo nie zostanie przekroczony dozwolony zakres.

Standardowe kolekcje nie mogą przechowywać typów prostych, co oznacza, że np ArrayList nie przechowuje elementów typu int ale obiekty typu Integer. Powoduje to duży narzut pamięciowy, który może być nieakceptowalny dla bardzo dużych list. Dodatkowo niemożliwa jest wydajna współpraca metod oczekujących List<Integer> oraz tablic int[]. W celu wymiany danych konieczna jest nowa alokacja pamięci i skopiowanie wszystkich danych do nowego formatu (rzutowanie Integer[] <-> int[] jest niemożliwe).

JIT/HotSpot powinien sobie bez trudu poradzić z eliminacją operacji box'ujących - zwłaszcza biorąc pod uwagę wewnętrzną implementację NativeArrayList. Jest niemal pewne, że tradycyjnych pętli kopiujących optymalizator nie może usunąć wcale.

Author:
ranides
See Also:
ArrayUtils.wrap(Object), ArrayUtils.wrap(Class, Object)

Constructor Summary
NativeArrayList(Class<?> clazz, Object array)
          Tworzy nową listę odwierciedlającą tablicę.
NativeArrayList(Class<?> clazz, Object array, int size)
          Tworzy nową listę odwierciedlającą tablicę.
NativeArrayList(Object array)
          Tworzy nową listę odwierciedlającą tablicę.
NativeArrayList(Object array, int size)
          Tworzy nową listę odwierciedlającą tablicę.
 
Method Summary
 void add(int index, T value)
           
 int capacity()
          Zwraca maksymalny dopuszczalny rozmiar listy.
 Class<?> component()
           
 Object delegator()
           
 T get(int index)
           
 T remove(int index)
           
 T set(int index, T element)
           
 int size()
           
 
Methods inherited from class java.util.AbstractList
add, addAll, clear, equals, hashCode, indexOf, iterator, lastIndexOf, listIterator, listIterator, subList
 
Methods inherited from class java.util.AbstractCollection
addAll, contains, containsAll, isEmpty, remove, removeAll, retainAll, toArray, toArray, toString
 
Methods inherited from class java.lang.Object
getClass, notify, notifyAll, wait, wait, wait
 
Methods inherited from interface java.util.List
addAll, contains, containsAll, isEmpty, remove, removeAll, retainAll, toArray, toArray
 

Constructor Detail

NativeArrayList

public NativeArrayList(Object array)
Tworzy nową listę odwierciedlającą tablicę. Modyfikacja listy zmienia zawartość tablicy, i vice versa. Rozmiar listy jest równy rozmiarowi podanej tablicy.

Parameters:
array -
See Also:
ArrayUtils.wrap(Object)

NativeArrayList

public NativeArrayList(Object array,
                       int size)
Tworzy nową listę odwierciedlającą tablicę. Modyfikacja listy zmienia zawartość tablicy, i vice versa. Początkowy rozmiar listy jest podawany jako argument. Do listy mogą być wstawiane nowe elementy tak długo, jak długo lista nie przekroczy maksymalnej pojemności tablicy.

Parameters:
array -
size - początkowy rozmiar zwracany przez listę

NativeArrayList

public NativeArrayList(Class<?> clazz,
                       Object array)
Tworzy nową listę odwierciedlającą tablicę. Modyfikacja listy zmienia zawartość tablicy, i vice versa.

Podana tablica jest "transparentnie" konwertowana na wskazany typ, a dopiero wynik konwersji jest używany przez kolekcję. Przykładowo traktowanie tablicy long[] jako tablicy byte[] umożliwia utworzenie listy typu List<Byte>. Konwersja jest wykonywana natywnie przez system hostujący (a nie przez VM!). Przekłada się to przede wszystkim na względnie większą wydajność kosztem nieprzenośności kodu ze względu na endianess.

Uwaga! Rzutowanie między typami o różnych rozmiarach powoduje, że lista ma capacity różne niż array.length

Parameters:
clazz -
array -
See Also:
ArrayUtils.wrap(Class, Object)

NativeArrayList

public NativeArrayList(Class<?> clazz,
                       Object array,
                       int size)
Tworzy nową listę odwierciedlającą tablicę. Modyfikacja listy zmienia zawartość tablicy, i vice versa. Początkowy rozmiar listy jest podawany jako argument. Do listy mogą być wstawiane nowe elementy tak długo, jak długo lista nie przekroczy maksymalnej pojemności tablicy.

Podana tablica jest "transparentnie" konwertowana na wskazany typ, a dopiero wynik konwersji jest używany przez kolekcję. Przykładowo traktowanie tablicy long[] jako tablicy byte[] umożliwia utworzenie listy typu List<Byte>. Konwersja jest wykonywana natywnie przez system hostujący (a nie przez VM!). Przekłada się to przede wszystkim na względnie większą wydajność kosztem nieprzenośności kodu ze względu na endianess.

Uwaga! Rzutowanie między typami o różnych rozmiarach powoduje, że lista ma capacity różne niż array.length

Parameters:
clazz -
array -
size - początkowy rozmiar zwracany przez listę
Method Detail

capacity

public int capacity()
Zwraca maksymalny dopuszczalny rozmiar listy.

Returns:

size

public int size()
Specified by:
size in interface Collection<T>
Specified by:
size in interface List<T>
Specified by:
size in class AbstractCollection<T>

get

public T get(int index)
Specified by:
get in interface List<T>
Specified by:
get in class AbstractList<T>

set

public T set(int index,
             T element)
Specified by:
set in interface List<T>
Overrides:
set in class AbstractList<T>

add

public void add(int index,
                T value)
Specified by:
add in interface List<T>
Overrides:
add in class AbstractList<T>

remove

public T remove(int index)
Specified by:
remove in interface List<T>
Overrides:
remove in class AbstractList<T>

component

public Class<?> component()

delegator

public Object delegator()


Copyright © 2013. All Rights Reserved.