package androidx.collection {

  public class ArrayMap<K, V> extends androidx.collection.SimpleArrayMap implements java.util.Map {
    ctor public ArrayMap();
    ctor public ArrayMap(int);
    ctor public ArrayMap(androidx.collection.SimpleArrayMap);
    method public boolean containsAll(java.util.Collection<?>);
    method public java.util.Set<java.util.Map.Entry<K, V>> entrySet();
    method public java.util.Set<K> keySet();
    method public void putAll(java.util.Map<? extends K, ? extends V>);
    method public boolean removeAll(java.util.Collection<?>);
    method public boolean retainAll(java.util.Collection<?>);
    method public java.util.Collection<V> values();
  }

  public final class ArraySet<E> implements java.util.Collection java.util.Set {
    ctor public ArraySet();
    ctor public ArraySet(int);
    ctor public ArraySet(androidx.collection.ArraySet<E>);
    ctor public ArraySet(java.util.Collection<E>);
    method public boolean add(E);
    method public void addAll(androidx.collection.ArraySet<? extends E>);
    method public boolean addAll(java.util.Collection<? extends E>);
    method public void clear();
    method public boolean contains(java.lang.Object);
    method public boolean containsAll(java.util.Collection<?>);
    method public void ensureCapacity(int);
    method public int indexOf(java.lang.Object);
    method public boolean isEmpty();
    method public java.util.Iterator<E> iterator();
    method public boolean remove(java.lang.Object);
    method public boolean removeAll(androidx.collection.ArraySet<? extends E>);
    method public boolean removeAll(java.util.Collection<?>);
    method public E removeAt(int);
    method public boolean retainAll(java.util.Collection<?>);
    method public int size();
    method public java.lang.Object[] toArray();
    method public <T> T[] toArray(T[]);
    method public E valueAt(int);
  }

  public final class CircularArray<E> {
    ctor public CircularArray();
    ctor public CircularArray(int);
    method public void addFirst(E);
    method public void addLast(E);
    method public void clear();
    method public E get(int);
    method public E getFirst();
    method public E getLast();
    method public boolean isEmpty();
    method public E popFirst();
    method public E popLast();
    method public void removeFromEnd(int);
    method public void removeFromStart(int);
    method public int size();
  }

  public final class CircularIntArray {
    ctor public CircularIntArray();
    ctor public CircularIntArray(int);
    method public void addFirst(int);
    method public void addLast(int);
    method public void clear();
    method public int get(int);
    method public int getFirst();
    method public int getLast();
    method public boolean isEmpty();
    method public int popFirst();
    method public int popLast();
    method public void removeFromEnd(int);
    method public void removeFromStart(int);
    method public int size();
  }

  public class LongSparseArray<E> implements java.lang.Cloneable {
    ctor public LongSparseArray();
    ctor public LongSparseArray(int);
    method public void append(long, E);
    method public void clear();
    method public androidx.collection.LongSparseArray<E> clone();
    method public boolean containsKey(long);
    method public boolean containsValue(E);
    method public void delete(long);
    method public E get(long);
    method public E get(long, E);
    method public int indexOfKey(long);
    method public int indexOfValue(E);
    method public boolean isEmpty();
    method public long keyAt(int);
    method public void put(long, E);
    method public void putAll(androidx.collection.LongSparseArray<? extends E>);
    method public void remove(long);
    method public void removeAt(int);
    method public void setValueAt(int, E);
    method public int size();
    method public E valueAt(int);
  }

  public class LruCache<K, V> {
    ctor public LruCache(int);
    method protected V create(K);
    method public final synchronized int createCount();
    method protected void entryRemoved(boolean, K, V, V);
    method public final void evictAll();
    method public final synchronized int evictionCount();
    method public final V get(K);
    method public final synchronized int hitCount();
    method public final synchronized int maxSize();
    method public final synchronized int missCount();
    method public final V put(K, V);
    method public final synchronized int putCount();
    method public final V remove(K);
    method public void resize(int);
    method public final synchronized int size();
    method protected int sizeOf(K, V);
    method public final synchronized java.util.Map<K, V> snapshot();
    method public final synchronized java.lang.String toString();
    method public void trimToSize(int);
  }

  public class SimpleArrayMap<K, V> {
    ctor public SimpleArrayMap();
    ctor public SimpleArrayMap(int);
    ctor public SimpleArrayMap(androidx.collection.SimpleArrayMap<K, V>);
    method public void clear();
    method public boolean containsKey(java.lang.Object);
    method public boolean containsValue(java.lang.Object);
    method public void ensureCapacity(int);
    method public V get(java.lang.Object);
    method public int indexOfKey(java.lang.Object);
    method public boolean isEmpty();
    method public K keyAt(int);
    method public V put(K, V);
    method public void putAll(androidx.collection.SimpleArrayMap<? extends K, ? extends V>);
    method public V remove(java.lang.Object);
    method public V removeAt(int);
    method public V setValueAt(int, V);
    method public int size();
    method public V valueAt(int);
  }

  public class SparseArrayCompat<E> implements java.lang.Cloneable {
    ctor public SparseArrayCompat();
    ctor public SparseArrayCompat(int);
    method public void append(int, E);
    method public void clear();
    method public androidx.collection.SparseArrayCompat<E> clone();
    method public boolean containsKey(int);
    method public boolean containsValue(E);
    method public void delete(int);
    method public E get(int);
    method public E get(int, E);
    method public int indexOfKey(int);
    method public int indexOfValue(E);
    method public boolean isEmpty();
    method public int keyAt(int);
    method public void put(int, E);
    method public void putAll(androidx.collection.SparseArrayCompat<? extends E>);
    method public void remove(int);
    method public void removeAt(int);
    method public void removeAtRange(int, int);
    method public void setValueAt(int, E);
    method public int size();
    method public E valueAt(int);
  }

}

