美文网首页
java.util.Collections

java.util.Collections

作者: 游牧族人 | 来源:发表于2018-10-07 11:17 被阅读26次

Collections 内部类

  • UnmodifiableCollection 返回不可更改的集合视图。对该方法返回的集合视图只允许查看,对他的任何修改操作将会抛出 UnsupportedOperationException 异常。
static class UnmodifiableCollection<E> implements Collection<E>, Serializable {
        private static final long serialVersionUID = 1820017752578914078L;

        final Collection<? extends E> c;  

        UnmodifiableCollection(Collection<? extends E> c) {
            if (c==null)
                throw new NullPointerException();
            this.c = c;
        }
        public boolean add(E e) {
            throw new UnsupportedOperationException();
        }
        ......// 各种集合操作方法  
            // 其中修改集合的方法都会抛出 UnsupportedOperationException 异常。
 }
-------------------------------------------------------------------------------------
UnmodifiableCollection
  -- UnmodifiableList
  -- UnmodifiableRandomAccessList
  -- UnmodifiableSet
  -- UnmodifiableSortedSet
  -- UnmodifiableNavigableSet
  -- UnmodifiableMap
  -- UnmodifiableSortedMap
  -- UnmodifiableNavigableMap
  • SynchronizedCollection 返回线程安全的集合视图,该方法返回的集合视图可以在多线程环境中使用。
    static class SynchronizedCollection<E> implements Collection<E>, Serializable {
        private static final long serialVersionUID = 3053995032091335093L;

        final Collection<E> c;  // Backing Collection
        final Object mutex;     // Object on which to synchronize  同步锁

        SynchronizedCollection(Collection<E> c) {
            this.c = Objects.requireNonNull(c);
            mutex = this;
        }

        SynchronizedCollection(Collection<E> c, Object mutex) {
            this.c = Objects.requireNonNull(c);
            this.mutex = Objects.requireNonNull(mutex);
        }
        public boolean add(E e) {
            synchronized (mutex) {return c.add(e);}
        }
       ...... // 各种集合操作方法
            // 其中所有方法均使用了 synchroized 关键字进行了同步处理。
 }
-------------------------------------------------------------------------------------
SynchronizedCollection
  -- SynchronizedList
  -- SynchronizedRandomAccessList
  -- SynchronizedSet
  -- SynchronizedSortedSet
  -- SynchronizedNavigableSet
  -- SynchronizedMap
  -- SynchronizedSortedMap
  -- SynchronizedNavigableMap
  • CheckedCollection 返回一个动态类型安全视图,对该视图进行添加元素时会自动进行元素类型检查,若检查不一致则抛出 ClassCastException 异常。
    例如:我们将编译过后的代码接口提供出去后,泛型会被擦除,这时没有了编译检查,我们此时向集合中添加泛型之外的对象类型是不会报错的,这就为其他错误埋下隐患。若是使用 CheckedCollection 返回的集合类型,则向集合中添加元素时会先进行元素类型检查,类型不一致便会抛出异常,提高了代码的鲁棒性。
static class CheckedCollection<E> implements Collection<E>, Serializable {
        private static final long serialVersionUID = 1578914078182001775L;

        final Collection<E> c;
        final Class<E> type;

        @SuppressWarnings("unchecked")
        E typeCheck(Object o) {
            if (o != null && !type.isInstance(o))
                throw new ClassCastException(badElementMsg(o));
            return (E) o;
        }

        private String badElementMsg(Object o) {
            return "Attempt to insert " + o.getClass() +
                " element into collection with element type " + type;
        }

        CheckedCollection(Collection<E> c, Class<E> type) {
            this.c = Objects.requireNonNull(c, "c");
            this.type = Objects.requireNonNull(type, "type");
        }
        public boolean add(E e){     
            return c.add(typeCheck(e)); 
        }
        ...... // 各种集合操作方法
   // add 方法会先检查传入值的类型是否与当前集合允许类型相符,不符则抛出异常。其他方法正常。
-------------------------------------------------------------------------------------
CheckedCollection
  -- CheckedQueue
  -- CheckedList
  -- CheckedRandomAccessList
  -- CheckedSet
  -- CheckedSortedSet
  -- CheckedNavigableSet
  -- CheckedMap
  -- CheckedSortedMap
  -- CheckedNavigableMap
  • Empty* 返回一个空的集合视图,其中包括 EmptyList,EmptySet,EmptyMap 。该视图只能为空,不能对他进行任何添加操作或者删除修改操作,即他是一个空的,不可变的集合。优势在于若我们需要一个空的集合时,使用这种方式比 new 一个空的集合更加节省空间。
源码没什么可看的,以集合空为前提重写集合各种操作方法。
-------------------------------------------------------------------------------------
Empty *
  -- EmptyList
  -- EmptySet
  -- EmptyMap 

EmptyIterator
EmptyListIterator
EmptyEnumeration
  • Singleton* 返回一个只包含一个元素的集合视图,其中包括SingletonList,SingletonSet,SingletonMap,由于规定了集合内部只包含一个元素,因此集合内部使用了单个属性字段代替集合进行数据存储,节省了空间。
// 看一个 List
    private static class SingletonList<E>
        extends AbstractList<E>
        implements RandomAccess, Serializable {

        private static final long serialVersionUID = 3093736618740652951L;

        private final E element;  // 仅仅使用了一个元素代替了整个集合
  
        SingletonList(E obj)                {element = obj;}

        public Iterator<E> iterator() {
            return singletonIterator(element);
        }

        public int size()                   {return 1;}

        public boolean contains(Object obj) {return eq(obj, element);}

        public E get(int index) {
            if (index != 0)
              throw new IndexOutOfBoundsException("Index: "+index+", Size: 1");
            return element;
        }
       ...... //  各种集合操作方法,实现前提均为集合中只有一个元素。
}
-------------------------------------------------------------------------------------
Singleton *
  -- SingletonList
  -- SingletonSet
  -- SingletonMap
  • CopiesList 返回一个 List,该 List 中存储的元素都是一样的,因此在 List内部只使用了一个元素的空间来维护整个 List 。
private static class CopiesList<E>
        extends AbstractList<E>
        implements RandomAccess, Serializable
    {
        private static final long serialVersionUID = 2739099268398711800L;

        final int n;               // 元素的数量
        final E element;          // 唯一的元素

        CopiesList(int n, E e) {
            assert n >= 0;
            this.n = n;
            element = e;
        }
        ......  // 各种 List 操作方法。
}
  • ReverseComparator 返回一个与自然顺序相反的比较器。

  • ReverseComparator2 返回一个与当前比较器顺序相反的比较器。

  • SetFromMap 通过一个Map 映射返回一个 Set 集合。其中 Map泛型 必须是 <Object , Boolean> ,创建 Set 之前 Map 必须为空。

    private static class SetFromMap<E> extends AbstractSet<E>
        implements Set<E>, Serializable
    {
        private final Map<E, Boolean> m;  // The backing map
        private transient Set<E> s;       // Its keySet

        SetFromMap(Map<E, Boolean> map) {
            if (!map.isEmpty())
                throw new IllegalArgumentException("Map is non-empty");
            m = map;
            s = map.keySet();
        }
        ......  // 方法
}

还不知道用途在哪里...
  • AsLIFOQueue 传入一个 Deque 返回一个后进先出队列(栈)。
不贴源码了...

Collections 常用方法

JDK API GO ! ~

相关文章

网友评论

      本文标题:java.util.Collections

      本文链接:https://www.haomeiwen.com/subject/rmokaftx.html