collections.java
来自「纯java操作系统jnode,安装简单和操作简单的个人使用的Java操作系统」· Java 代码 · 共 2,446 行 · 第 1/5 页
JAVA
2,446 行
* Either the list has it or not.
*/
public int indexOf(Object o)
{
return equals(o, element) ? 0 : -1;
}
/**
* Either the list has it or not.
*/
public int lastIndexOf(Object o)
{
return equals(o, element) ? 0 : -1;
}
/**
* Sublists are limited in scope.
*/
public List subList(int from, int to)
{
if (from == to && (to == 0 || to == 1))
return EMPTY_LIST;
if (from == 0 && to == 1)
return this;
if (from > to)
throw new IllegalArgumentException();
throw new IndexOutOfBoundsException();
}
/**
* Returning an array is simple.
*/
public Object[] toArray()
{
return new Object[] {element};
}
/**
* Obvious string.
*/
public String toString()
{
return "[" + element + "]";
}
} // class SingletonList
/**
* Obtain an immutable Map consisting of a single key-value pair.
* The return value of this method is Serializable.
*
* @param key the single key
* @param value the single value
* @return an immutable Map containing only the single key-value pair
* @see Serializable
* @since 1.3
*/
public static Map singletonMap(Object key, Object value)
{
return new SingletonMap(key, value);
}
/**
* The implementation of {@link #singletonMap(Object)}. This class name
* is required for compatibility with Sun's JDK serializability.
*
* @author Eric Blake <ebb9@email.byu.edu>
*/
private static final class SingletonMap extends AbstractMap
implements Serializable
{
/**
* Compatible with JDK 1.4.
*/
private static final long serialVersionUID = -6979724477215052911L;
/**
* The single key.
* @serial the singleton key
*/
private final Object k;
/**
* The corresponding value.
* @serial the singleton value
*/
private final Object v;
/**
* Cache the entry set.
*/
private transient Set entries;
/**
* Construct a singleton.
* @param key the key
* @param value the value
*/
SingletonMap(Object key, Object value)
{
k = key;
v = value;
}
/**
* There is a single immutable entry.
*/
public Set entrySet()
{
if (entries == null)
entries = singleton(new AbstractMap.BasicMapEntry(k, v)
{
public Object setValue(Object o)
{
throw new UnsupportedOperationException();
}
});
return entries;
}
// The remaining methods are optional, but provide a performance
// advantage by not allocating unnecessary iterators in AbstractMap.
/**
* Single entry.
*/
public boolean containsKey(Object key)
{
return equals(key, k);
}
/**
* Single entry.
*/
public boolean containsValue(Object value)
{
return equals(value, v);
}
/**
* Single entry.
*/
public Object get(Object key)
{
return equals(key, k) ? v : null;
}
/**
* Calculate the hashcode directly.
*/
public int hashCode()
{
return hashCode(k) ^ hashCode(v);
}
/**
* Return the keyset.
*/
public Set keySet()
{
if (keys == null)
keys = singleton(k);
return keys;
}
/**
* The size: always 1!
*/
public int size()
{
return 1;
}
/**
* Return the values. Technically, a singleton, while more specific than
* a general Collection, will work. Besides, that's what the JDK uses!
*/
public Collection values()
{
if (values == null)
values = singleton(v);
return values;
}
/**
* Obvious string.
*/
public String toString()
{
return "{" + k + "=" + v + "}";
}
} // class SingletonMap
/**
* Sort a list according to the natural ordering of its elements. The list
* must be modifiable, but can be of fixed size. The sort algorithm is
* precisely that used by Arrays.sort(Object[]), which offers guaranteed
* nlog(n) performance. This implementation dumps the list into an array,
* sorts the array, and then iterates over the list setting each element from
* the array.
*
* @param l the List to sort
* @throws ClassCastException if some items are not mutually comparable
* @throws UnsupportedOperationException if the List is not modifiable
* @throws NullPointerException if some element is null
* @see Arrays#sort(Object[])
*/
public static void sort(List l)
{
sort(l, null);
}
/**
* Sort a list according to a specified Comparator. The list must be
* modifiable, but can be of fixed size. The sort algorithm is precisely that
* used by Arrays.sort(Object[], Comparator), which offers guaranteed
* nlog(n) performance. This implementation dumps the list into an array,
* sorts the array, and then iterates over the list setting each element from
* the array.
*
* @param l the List to sort
* @param c the Comparator specifying the ordering for the elements, or
* null for natural ordering
* @throws ClassCastException if c will not compare some pair of items
* @throws UnsupportedOperationException if the List is not modifiable
* @throws NullPointerException if null is compared by natural ordering
* (only possible when c is null)
* @see Arrays#sort(Object[], Comparator)
*/
public static void sort(List l, Comparator c)
{
Object[] a = l.toArray();
Arrays.sort(a, c);
ListIterator i = l.listIterator(a.length);
for (int pos = a.length; --pos >= 0; )
{
i.previous();
i.set(a[pos]);
}
}
/**
* Swaps the elements at the specified positions within the list. Equal
* positions have no effect.
*
* @param l the list to work on
* @param i the first index to swap
* @param j the second index
* @throws UnsupportedOperationException if list.set is not supported
* @throws IndexOutOfBoundsException if either i or j is < 0 or >=
* list.size()
* @since 1.4
*/
public static void swap(List l, int i, int j)
{
l.set(i, l.set(j, l.get(i)));
}
/**
* Returns a synchronized (thread-safe) collection wrapper backed by the
* given collection. Notice that element access through the iterators
* is thread-safe, but if the collection can be structurally modified
* (adding or removing elements) then you should synchronize around the
* iteration to avoid non-deterministic behavior:<br>
* <pre>
* Collection c = Collections.synchronizedCollection(new Collection(...));
* ...
* synchronized (c)
* {
* Iterator i = c.iterator();
* while (i.hasNext())
* foo(i.next());
* }
* </pre><p>
*
* Since the collection might be a List or a Set, and those have incompatible
* equals and hashCode requirements, this relies on Object's implementation
* rather than passing those calls on to the wrapped collection. The returned
* Collection implements Serializable, but can only be serialized if
* the collection it wraps is likewise Serializable.
*
* @param c the collection to wrap
* @return a synchronized view of the collection
* @see Serializable
*/
public static Collection synchronizedCollection(Collection c)
{
return new SynchronizedCollection(c);
}
/**
* The implementation of {@link #synchronizedCollection(Collection)}. This
* class name is required for compatibility with Sun's JDK serializability.
* Package visible, so that collections such as the one for
* Hashtable.values() can specify which object to synchronize on.
*
* @author Eric Blake <ebb9@email.byu.edu>
*/
static class SynchronizedCollection
implements Collection, Serializable
{
/**
* Compatible with JDK 1.4.
*/
private static final long serialVersionUID = 3053995032091335093L;
/**
* The wrapped collection. Package visible for use by subclasses.
* @serial the real collection
*/
final Collection c;
/**
* The object to synchronize on. When an instance is created via public
* methods, it will be this; but other uses like SynchronizedMap.values()
* must specify another mutex. Package visible for use by subclasses.
* @serial the lock
*/
final Object mutex;
/**
* Wrap a given collection.
* @param c the collection to wrap
* @throws NullPointerException if c is null
*/
SynchronizedCollection(Collection c)
{
this.c = c;
mutex = this;
if (c == null)
throw new NullPointerException();
}
/**
* Called only by trusted code to specify the mutex as well as the
* collection.
* @param sync the mutex
* @param c the collection
*/
SynchronizedCollection(Object sync, Collection c)
{
this.c = c;
mutex = sync;
}
public boolean add(Object o)
{
synchronized (mutex)
{
return c.add(o);
}
}
public boolean addAll(Collection col)
{
synchronized (mutex)
{
return c.addAll(col);
}
}
public void clear()
{
synchronized (mutex)
{
c.clear();
}
}
public boolean contains(Object o)
{
synchronized (mutex)
{
return c.contains(o);
}
}
public boolean containsAll(Collection c1)
{
synchronized (mutex)
{
return c.containsAll(c1);
}
}
public boolean isEmpty()
{
synchronized (mutex)
{
return c.isEmpty();
}
}
public Iterator iterator()
{
synchronized (mutex)
{
return new SynchronizedIterator(mutex, c.iterator());
}
}
public boolean remove(Object o)
{
synchronized (mutex)
{
return c.remove(o);
}
}
public boolean removeAll(Collection col)
{
synchronized (mutex)
{
return c.removeAll(col);
}
}
public boolean retainAll(Collection col)
{
synchronized (mutex)
{
return c.retainAll(col);
}
}
public int size()
{
synchronized (mutex)
{
return c.size();
}
}
public Object[] toArray()
{
synchronized (mutex)
{
return c.toArray();
}
}
public Object[] toArray(Object[] a)
{
synchronized (mutex)
{
return c.toArray(a);
}
}
public String toString()
{
synchronized (mutex)
{
return c.toString();
}
}
} // class SynchronizedCollection
/**
* The implementation of the various iterator methods in the
* synchronized classes. These iterators must "sync" on the same object
* as the collection they iterate over.
*
* @author Eric Blake <ebb9@email.byu.edu>
*/
private static class SynchronizedIterator implements Iterator
{
/**
* The object to synchronize on. Package visible for use by subclass.
*/
final Object mutex;
/**
* The wrapped iterator.
*/
private final Iterator i;
/**
* Only trusted code creates a wrapper, with the specified sync.
* @param sync the mutex
* @param i the wrapped iterator
*/
SynchronizedIterator(Object sync, Iterator i)
{
this.i = i;
mutex = sync;
}
public Object next()
{
synchronized (mutex)
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?