美文网首页
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