Java集合——集合框架


Java最初版本只提供了很少一组类:Vector、Stack、Hashtable、BitSet与Enumeration接口,其中Enumeration接口提供了一种用于访问任意容器中各个元素的抽象机制

1.将集合的接口与实现分离:

    例如队列,接口为Queue,如果需要一个循环数组队列就可以使用ArrayDeque类。如果需要一个链表队列,就直接使用LinkedList类

2.Collection接口:

    Collection接口是集合类的基本接口,有两个基本的方法add和iterator

3.迭代器:

    Iterator接口只包含4个方法:

    public interface Iterator<E>{  

        boolean hasNext();

        E next();//逐个访问集合中的每一个元素

        default void remove() {

            throw new UnsupportedOperationException("remove");

        }

        default void forEachRemaining(Consumer<? super E> action) {

            Objects.requireNonNull(action);

            while (hasNext())

                action.accept(next());

        }

    }

    编译器简单的将“for each”循环翻译为带有迭代器的循环

    “for each”循环可以与任何实现了Iterable接口的对象一起工作,这个接口只有一个抽象方法

    public interface Iterable<T> {  
 
        Iterator<T> iterator();

        default void forEach(Consumer<? super T> action) {

           Objects.requireNonNull(action);

                for (T t : this) {

                    action.accept(t);

                }

            }

            default Spliterator<T> spliterator() {

                return Spliterators.spliteratorUnknownSize(iterator(), 0);

            }

    }

    Collection接口扩展了Iterable接口,所以,对于标准类库中的任何集合都可以使用“for each”循环

    在Java SE 8中,甚至不用写循环。可以调用forEachRemaining方法并提供一个lambda表达式。将对迭代器的每一个元素调用这个lambda表达式

    iterator.forEachRemaining(element->...);

    在Java中迭代器可以认为在两个元素之间。当调用next方法时,迭代器就越过下一个元素,并返回刚刚越过的那个元素的引用。可以将Iterator.next和InputStream.read看作为等效

    

    如果在对元素进行操作时没有调用next方法就会抛出一个IllegalStateException异常

4.java.util.Collection<E> 1.2:

    Iterator<E> iterator()

    返回一个用于访问集合中每个元素的迭代器

    int size()

    返回当前存储在集合中的元素个数

    boolean isEmpty()

    判断集合中是否有元素

    boolean contains(Object obj)

    判断集合中是否存在obj

    boolean containsAll(Collection<?> other)

    判断集合中是否包含other集合中的全部元素

    boolean add(Object element)

    判断添加元素是否成功

    boolean addAll(Collection<? extends E> other)

    判断添加集合是否成功

    boolean remove(Object obj)

    判断集合中obj元素是否移除

    boolean removeAll(Collection<?> other)

    从集合中移除other中存在的所有元素

    default boolean removeIf(Predicate<? super E> filter) 8

    从这个集合删除filter返回true的所有元素

    void clear()

    清空集合

    boolean retainAll(Collection<?> other)

    从集合中删除与other集合中元素不同的元素

    Object[] toArray()

    返回这个集合的对象数组

    <T> T[] toArray(T[] arrayToFill)

    返回这个集合的对象数组。如果arrayToFill足够大,就将集合中的元素填入这个数组,其余部分为null;否则分配一个新数组与arrayToFill的成员类型相同,器长度等于集合的大小,并填充集合元素

5.List接口:

    从图中可以看出List是个有序集合,可以采用两种方式访问元素:使用迭代器和一个整数索引。也可以称为有序访问和随机访问。

    List本身提供了多个用于随机访问的方法,其实这种设计方式并不好,因为List后面分为两种有序集合:一种是数组一种是链表,相对于链表而言随机访问很慢,所以这个使用就需要使用迭代器访问。为了避免对链表完成随机访问操作,Java SE 1.4引入了一个标记接口RandomAccess。这个接口不含方法,不过可以用它来测试一个特定的集合是否支持高效的随机访问

    if(c instanceof RandomAccess){

    }else{}

6.ListIterator接口:

    它是Iterator接口的子接口,它定义了一个方法用于在迭代器位置前面增加一个元素:

    void add(E element);

7.Set接口:

    该接口等同于Collection接口,不过其方法的行为有更加严谨的定义——add方法不允许增加重复的元素

8.SortedSet和SortedMap接口:

    这两个接口会提供用于排序的比较器对象,这两个接口定义了可以得到集合子集视图的方法

9.NavigableSet和NavigableMap接口:

    这是Java SE 6引入的接口,其中包含一些用于搜索和遍历所有序集和映射的方法


推荐一篇不错的文章:https://www.cnblogs.com/leeplogs/p/5891861.html

猜你喜欢

转载自blog.csdn.net/qq_38386085/article/details/80891343