集合结合数据结构来看看(三)

一、队列和栈

什么是队列?队列是一种只能在一端插入,另外一端删除的有序线性表,队列中第一个插入也就第一个被移除,所以队列是一种先进先出的线性表;

什么是栈?栈是一种有序线性表,只能在表的一端进行插入和删除,最后插入的元素被第一个删除,所以栈是一种后进先出的线性表;

接下来还是上图

二、栈源码

这里直接看源代码吧,因为用单链表以及数组实现,如果前几篇看懂了实现一个栈还是很简单的,那我们直接看起源码来吧;

还是老样子先看继承结构:

public class Stack<E> extends Vector<E> 

这里看下Stack这个类继承Vector这个类,那么我们就需要跳进去看下这个类的实现

public class Vector<E>
    extends AbstractList<E>
    implements List<E>, RandomAccess, Cloneable, java.io.Serializable

看到这个结构我们一定会很熟悉一下就想到了ArryList这个接口,所以这里不做过多的强调一些方法,这里只说一些重点内容;

1).Vertor类所有方法都实现了同步,这里除去迭代的方法,因为每一个方法上都增加了synchronized这个关键字;

2).这里强调一下扩容的方法,这里还的看下这个构造函数,才能对比出差别

    public Vector(int initialCapacity, int capacityIncrement) {
        super();
        if (initialCapacity < 0)
            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
        this.elementData = new Object[initialCapacity];
        this.capacityIncrement = capacityIncrement;
    }
    private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
                                         capacityIncrement : oldCapacity);
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        elementData = Arrays.copyOf(elementData, newCapacity);
    }

这个构造函数初始化了一个capacityIncrement变量这个影响了数组扩容的大小,如果不指定就是默认扩展一倍,看到这里如果看过的第一篇的读者就知道与ArryList的差别了,忘记的了也没关系,可以翻看一下,这里我们稍微延伸性下,由于每个操作都是同步的方法,肯定在操作会影响性能,但是我们通常进行的单一操作,不管是添加还是删除或者等等一系列操作,我们肯定还需要声明一个锁来保证操作的安全性,所以这就需要2个锁来解决线程的安全问题,想到这里大家就明白为什么Vector这个类被废弃了吧。接下来我们还是继续Stack这个类在Vector这个类上主要包括了栈的push和 pop 操作,以及取堆栈顶点的 peek方法、测试堆栈是否为空的 empty 方法、在堆栈中查找项并确定到堆栈顶距离的 search方法。

、队列源码

public interface Queue<E> extends Collection<E> 

同样是直接看源码吧,这里看到了Collection这个类,这里需要提一下Collections这2个是不同的类,Collection这个类是一个集合接口。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式。而这个Collections是一个包装类,它包含有各种有关集合操作的静态多态方法。此类不能实例化,就像一个工具类,服务于Java的Collection框架,关于这个类我后面会介绍下这个类的API,先说今天的重点吧,下图是Collection继承结构,图虽然有些不标准,相信大家基本上还是能看明白的。这里说下每个分支基本上能干什么事,对Connlection这个体系的集合有简单的明白;

首先说一下Iterable,可以通过这个获取一个Iterator,使用这个进行迭代,下面是接口里面包含的方法;

  Iterator<T> iterator();

接下来说Collection,这个里面主要包含一些对集合操作的方法,另外还有进行遍历的方法;剩下的子类就是对其扩展这里说下之间的不同,List这个接口是有序集合,可以根据索引进行值的查找,另外List里面可以允许重复值的出现;下面将List不同的API列出来让大家更明朗一些,可能没有复制全,因为源码注释有点多,另外就是List还提供listIterator这个方法,这个继承Iterator这个类,是集合可以向前迭代。

    E get(int index);

    E set(int index, E element);

    void add(int index, E element);

    E remove(int index);

    int indexOf(Object o);

    int lastIndexOf(Object o);

    ListIterator<E> listIterator();

    ListIterator<E> listIterator(int index);

    List<E> subList(int fromIndex, int toIndex);

接下来是Set这个不允许保存重复的元素,Set在Collection的接口上没做什么变动,完全一样,SortedSet这个接口最要是一些排序接口,TreeSet主要实现了SortedSet这个接口,内部方法相对比较简单,主要通过Comparator这个接口进行实现一系列的接口;NavigableSet这个接口主要扩展SortedSet具有搜索元素的方法,这个里面的接口我感觉说不容易很没明白大家写个测试程序看下就可以,真的没什么搞头(我有测试程序大家想要可以私聊下我);

public interface SortedSet<E> extends Set<E> {
     //返回一个比较器
    Comparator<? super E> comparator();
    //返回2个元素之间的集合
    SortedSet<E> subSet(E fromElement, E toElement);
   //返回小于该元素的集合
    SortedSet<E> headSet(E toElement);
  //返回大于或者等于该元素的集合
    SortedSet<E> tailSet(E fromElement);
     E first();//set中第一个元素
    E last();//set中最后一个元素
}

最后来一下今天的主题Queue,这里主要说下注意的地方Queue使用时要尽量避免Collection的add()和remove()方法,而是要使用offer()来加入元素,使用poll()来获取并移出元素。它们的优点是通过返回值可以判断成功与否,add()和remove()方法在失败的时候会抛出异常。 如果要使用头部元素而不移出该元素,使用
element()或者peek()方法;接下来说下Deque这个接口,这个需要说下双端队列和队列的差别,队列只允许在一端插入,在另外一端删除,而双端队列是一种扩展,它可以在两端进行删除和插入;因为可以在两端访问所以是一种具有栈和队列性质的数据结构,这里需要说一下Stack这个接口因为是同步线程,我们在选择实现队列的时候应该优先选择Deque这个接口,下面可以列一个简单的对应关系,让大家明白这个接口内部方法与队列和接口的对应关系;

、结束语

其实队列和栈里面的东西还有好多应用场景,以后有遇到再说喽,等等把map这些都说完的时候我做一个完整的集合的继承结构,接下来就是树喽,最近还有想法写下SSH,java我也进入到框架学习了,其实我这边还有好多.net MVC的介绍都是写了一半。

时间: 2024-10-23 18:22:09

集合结合数据结构来看看(三)的相关文章

集合结合数据结构来看看

一.先来唠一唠?     上一篇泛型适宜本意还想继续往下写写,来一下协变与逆变,奈何不知道怎么该往下写,等等我思考一下,在继续写~接下来聊聊数据结构这一话题,想到数据结构就想起了那一年我在工院上课就睡觉的时光,真实暴遣天物呀,不扯开始话题,数据结构可能在我们工作的时候用的不算太多,但是实际上不管java或者C#都将这些封装到我们常用的类里面,就比如说集合就是数据结构的真实写照~ 二.数组先来扯一扯?     数组不算是集合,但是还是想用来他的东西来说明数据结构的一些东西,不算是偏题哈~我们都知道

不相交集合的数据结构

不相交集合的数据结构 本来想着来实现基于贪婪思想的Kruskal算法-–最小生成树的算法之一. 却发现当我们合并集合时里面还涉及到一个判断"环"的问题,继而有了本篇博文:不相交集合的数据结构. 关于不相交集合的数据结构,这里作一个简单的介绍,更多的可看这里 第一:我们假设我们有n个不相交的集合{Si},i=1~n:其中每个集合中都有一个"代表元素"(这个"代表元素"你可以理解为我们班级中的"班长",对外"班长&quo

20172328《程序设计与数据结构》第三周学习总结

20172328李馨雨<程序设计与数据结构>第三周学习总结 教材学习内容总结 1.学习使用new运算符建立对象(即实例化),了解null空引用.具体体悟 :类和对象的关系. 2.对象引用变量的声明和初始化.用"."来引用方法,并且需要保留(). 3.了解String类的一些基本方法和标准类库java API. 4.除了在java.lang中的变量无需import声明,其他都需要import声明(简化类的多次引用). 5.了解和使用Random类和Math类. 6.理解格式化

20172313 2018-2019-1 《程序设计与数据结构》第三周学习总结

20172313 2018-2019-1 <程序设计与数据结构>第三周学习总结 教材学习内容总结 概述 队列是一种线性集合,其元素从一端加入,从另一端删除:队列的元素是按FIFO方式处理的.第一个进入的元素,也就是第一个退出的元素. 队列有队头(front)和队尾(rear),数据从队尾进入队列,从队头出队列,队头(front)指向队列的第一个数据,队尾(rear)指向队列中的最后一个数据. JavaAPI中的队列 Java集合API提供了java.util.Stack类,它实现了栈集合.但它

2018-2019-20172329 《Java软件结构与数据结构》第三周学习总结

2018-2019-20172329 <Java软件结构与数据结构>第三周学习总结 教材学习内容总结 <Java软件结构与数据结构>第五章-队列 一.概述 1.队列是什么? 队列是种线性集合,其元素从一端加入,从另一端删除:注:队列是按照先进先出的方式处理的.从队列中删除元素的次序,与放置元素的次序是一样的. 2.队列的构成 (1)方法: 操作 描述 enqueue 向队列末端添加一个元素 dequeue 从队列前段删除一个元素 first 考察队列前端的那个元素 isempty

20172332 2017-2018-2 《程序设计与数据结构》第三周学习总结

20172332 2017-2018-2 <程序设计与数据结构>第三周学习总结 教材学习内容总结 第五章 队列 1.队列是一种线性集合,元素从一段加入从另一端删除(先进先出). 2.队尾(tail),队首(head),队列前端(front),队列末端(rear). 3.使用队列的一些实例:凯撒密码,售票口模拟. 4.分别用链表和数组实现队列. 5.双端队列,允许从队列的两端添加.删除和查看元素. 6.环形数组实现队列. 教材学习中的问题和解决过程 问题1:为什么用数组实现队列时,环形数组较好?

20172306 2018-2019《程序设计与数据结构》第三次总结

20172306 2018-2019<Java程序设计与数据结构>第三周学习总结 教材学习内容总结 概述 队列元素是先进先出,从队列删除元素的顺序,与往队列放置元素的次序是一样的 在栈中,其处理过程只在栈的某一端进行:而在队列中,其处理过程可在队列的两端进行 操作 说明 enqueue 向队列末端添加一个元素 dequeue 从队列前端删除一个元素 first 考察队列前端的那个元素 isempty 判定队列是否为空 size 判定队列中的元素数目 toString 返回队列的字符串表示 en

20172311《程序设计与数据结构》第三周学习总结

20172311<程序设计与数据结构>第三周学习总结 教材学习内容总结 第五章 队列 在任何的队列中,元素都是从一端进入,从另一端离开 队列是一种线性集合,先进先出即第一个进入的元素也是第一个退出的元素 与栈类似,队列中没有操作能让用户"抵达"队列中部,同样也没有操作允许用户重组或删除多个元素 队列的首要作用是保持顺序 对于单向链表实现队列,可选择从末端入列,从前端出列 用固定数组来实现栈的效率不高,把数组看作是环形的,可以除去在队列的数组实现中把元素位移的需要 教材学习中

20172301 《程序设计与数据结构》第三周学习总结

20172301 <程序设计与数据结构>第三周学习总结 教材学习内容总结 队列 队列是一种线性集合,先进先出. 元素一般从队列末端进入,从队列前端退出. 在栈中,处理过程只在栈的一端进行:在队列中,处理过程在队列的两端进行. API中的队列 Stack类实现了栈集合.却没有队列类.只提供了 Queue接口 Stack类提供了基本操作.Queue接口只定义了两种方法,添加元素和删除元素. 使用队列:代码密钥(书上代码杂乱无章) 详见教材问题二.戳 用链表实现队列: 在enqueue操作,在链表前