zoukankan      html  css  js  c++  java
  • 【集合】Java集合框架

      Java类库中帮助我们在程序设计中实现了传统的数据结构。本文章跳过理论部分,主要介绍如何使用标准库中的集合类。

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

      Java集合类库将接口与实现分离。以队列为例:

    1 public interface Queue<E> extends Collection<E> {
    2     boolean add(E e);
    3 
    4     E remove();
    5 
    6    /*
    7       其他方法  
    8   */  
    9 }

    上述代码为Java类库中队列的一部分代码,可以看到,这个接口没有说明队列是如何实现的。

    队列通常有两种实现方式:

    1.使用循环数组

    2.使用链表

    而在Java中,每一种实现都可以通过一个实现了Queue接口的类表示:

    实现循环数组方式的双端队列,Java中使用 ArrayDeque类实现,这个类实现了继承自Queue接口的Deque接口,并使用一个数组存储队列中的元素。

    实现链表方式的双堆队列,Java中的 LinkedList类通过实现同样的Deque接口实现。

    使用接口与实现的模式,当程序中使用到队列时,一旦构建了集合便不需要知道使用了那种实现,当一旦改变了想法,可以轻松的在构建集合的位置改成另外一种实现。

    2 Collection 接口

    public interface Collection<E>
    {
            boolean add(E element);
            Iterator<E> iterator();
            ...其他方法
    }

    add 方法用于添加元素,如果添加元素改变了集合就返回true,否则返回false。如果试图想一个集中添加一个已有对象,添加请求就不会生效,因为集中不允许存在重复对象。

    iterator 方法返回一个实现了Iterator 接口的对象。

    3 迭代器

     1 package java.util;
     2 
     3 import java.util.function.Consumer;
     4 
     5 public interface Iterator<E> {
     6     boolean hasNext();
     7     E next();
     8     void remove();
     9     void forEachRemaining(Consumer<? super E> action);
    10 }

    Iterator 接口中包含4个方法:

      next() :通过反复调用next()方法,可以逐个访问集合中的元素,但是如果到达了集合的末端,next方法将抛出一个 NoSuchElementException,因此,一般在调用next()方法前调用hasNext()方法。

      hasNext() :如果迭代器对象还有供访问的对象,则返回true。

      forEachRemaining:Java8中的遍历方法,参数为一个lambda表达式,迭代器将对每一个元素执行这个lambda表达式。

      remove() :删除上次调用next方法时返回的元素,如果调用remove前没有调用next方法,这将是不合法的,会抛出一个 IllegalStateException 异常。

        如果要删除两个相邻的元素,不能直接调用两次remove

    iterator.remove();
    iterator.remove(); //error
    
    iterator.remove();
    iterator.next();
    iterator.remove(); //true

    Collection 接口声明了许多实用的方法,为了让实现者更好实现Collection接口,Java提供了一个AbstractCollection的类,它将基础方法size和iterator抽象化了,而其他的方法提供了默认的实现,实现者只需要一个具体的集合类继承AbstractCollection类,就可以实现Collection接口。

    4 集合框架中的接口

      Java集合框架为不同类型的集合提供了大量的接口

      

    集合中的两个基本接口:

    •   Collection:

        List 是一个有序集合,可以支持迭代器访问和随机访问。

        Set 其add方法不允许增加重复的元素,因此使用时应 适当地定义Set的equals方法:只要两个集包含同样的元素就认为是相等的;适当地定义hashCode方法 :保证包含相同的元素的两个集会得到相同的散列码。

          SortedSet 会提供用于排序的比较器对象,定义了可以得到集合子集的视图。

          NavigableSet 包含一些用于搜索和遍历有序集的方法,TreeSet实现了这个接口。

        Queue 是一个先进先出的队列。

        Deque 双端队列

    • Map:包含键值对的映射

       SortedMap 会提供用于排序的比较器对象,定义了可以得到集合子集的视图。

       NavigableMap 包含一些用于搜索和遍历映射的方法,TreeMap实现了这个接口。

       

      ListIterator 是Iterator 的一个子接口。它定义了一个方法用于在迭代器位置前面增加一个元素:void add(E element)

      为了避免对链表进行随机访问操作,Java引入了RandomAccess标记接口,该接口不包含任何方法,但可以用它来测试一个集合是否支持随机访问。

    if(c instanceof RandomAccess){
        使用随机访问
    }else{
        使用迭代器访问
    }
  • 相关阅读:
    Java 时钟
    mybatis中的#和$的区别
    vuex数据管理-数据共享
    vuex数据管理-数据适配
    vue双向数据绑定原理
    基于VUE的SPA单页应用开发-加载性能篇
    vue2.0读书笔记3
    移动端软键盘收起监听
    移动端模态窗口的滚动和橡皮筋问题解决方案
    window.history的跳转实质-HTML5 history API 解析
  • 原文地址:https://www.cnblogs.com/zoujiejun96/p/8787081.html
Copyright © 2011-2022 走看看