Java源码刨析之ArrayDeque

yizhihongxing

Java源码刨析之ArrayDeque

Java中的ArrayDeque是一种基于动态数组的双端队列数据结构。本篇文章将与读者一起深入分析Java中ArrayDeque的源代码,从中学习这种数据结构的实现原理。

容量扩充

由于使用动态数组来存储队列中的元素,因此在添加元素时,需要判断是否需要扩展数组的容量。容量扩充的代码实现如下:

private void doubleCapacity() {
    int newCapacity = elements.length << 1;
    if (newCapacity < 0)
        throw new IllegalStateException("Sorry, deque too big");
    Object[] newArray = new Object[newCapacity];
    int headN = elements.length - head;
    System.arraycopy(elements, head, newArray, 0, headN);
    System.arraycopy(elements, 0, newArray, headN, head);
    elements = newArray;
    head = 0;
    tail = size;
}

这段代码中首先将数组容量扩展为原来的两倍,然后使用System类的arraycopy()方法将原数组中从head位置开始到末尾的元素拷贝到新的数组的开头,将原数组中从0位置到head位置的元素拷贝到新的数组中从headN位置开始的位置,最后再改变head和tail的值,以确定队列的范围和队列大小。

入队操作

队列的入队操作代码如下:

public boolean add(E e) {
    addLast(e);
    return true;
}

public void addLast(E e) {
    if (e == null)
        throw new NullPointerException();
    elements[tail] = e;
    if ((tail = (tail + 1) & (elements.length - 1)) == head)
        doubleCapacity();
    size++;
}

这段代码首先将新元素添加到队列的尾部,并通过位运算的方式取得新的tail值。然后检查队列是否已满,如果满了就执行容量扩充操作。

出队操作

队列的出队操作代码如下:

public E removeFirst() {
    E x = pollFirst();
    if (x == null)
        throw new NoSuchElementException();
    return x;
}

public E pollFirst() {
    int h = head;
    @SuppressWarnings("unchecked")
    E result = (E) elements[h];
    // Element is null if deque empty
    if (result == null)
        return null;
    elements[h] = null;     // Must null out slot
    head = (h + 1) & (elements.length - 1);
    size--;
    return result;
}

这段代码首先调用了pollFirst()方法获取队列中第一个元素,并返回该元素的值。如果该元素为null,则抛出NoSuchElementException异常。最后还需要将head的值加1,并将队列大小减1。

示例说明

下面以两条示例说明ArrayDeque的使用。

示例1:正向遍历

ArrayDeque<String> deque = new ArrayDeque<>();
deque.add("Java");
deque.add("is");
deque.add("awesome");

for(String str : deque) {
    System.out.println(str);
}

输出结果:
Java
is
awesome

该示例首先创建了一个String类型的ArrayDeque对象,在该对象中添加了三个元素。然后使用for循环遍历该队列,依次打印出队列中的每个元素。

示例2:反向遍历

ArrayDeque<String> deque = new ArrayDeque<>();
deque.push("Java");
deque.push("is");
deque.push("awesome");

Iterator<String> iterator = deque.descendingIterator();

while(iterator.hasNext()) {
    System.out.println(iterator.next());
}

输出结果:
awesome
is
Java

该示例与示例1类似,创建了一个String类型的ArrayDeque对象,并在该对象中添加了三个元素。不同之处在于使用push()方法将元素添加到队列的头部。接着使用迭代器将队列反向遍历,并依次打印出所有元素。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java源码刨析之ArrayDeque - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • spring动态bean注册示例分享

    下面是详细讲解“spring动态bean注册示例分享”的完整攻略。 什么是动态bean注册 在Spring中,Bean是所有服务的基本单元。Spring容器会将所有的Bean实例化,管理和组装起来,使它们能够可以相互协作。Bean注册是向Spring容器声明Bean定义的过程,通常是在XML文件或者Java代码中进行的。 动态bean注册是指在运行时添加、修…

    Java 2023年6月15日
    00
  • HashMap和HashTable底层原理以及常见面试题

    HashMap和HashTable底层原理以及常见面试题 1. HashMap和HashTable的区别 HashMap和HashTable都是Java中的重要容器类,它们的目的是为了存放和访问键值对。虽然它们的功能是相似的,但是它们在底层的实现和使用上有很大的不同。 1.1 HashMap HashMap的底层是基于哈希表实现的,其键值对存储在Entry数…

    Java 2023年5月26日
    00
  • 有关Java中的BeanInfo介绍

    一、BeanInfo是什么 BeanInfo是Java语言中一个专门为Java Bean设计的接口,用于操作Bean的元数据信息。BeanInfo主要描述了一个Java Bean的属性、方法、事件等信息,BeanInfo主要是为Java图形界面编辑器提供Bean对象的界面定制化功能而使用,其中面向对象的特性使得BeanInfo的属性信息更加具有灵活性。Bea…

    Java 2023年5月20日
    00
  • Java 网络编程 —— 创建多线程服务器

    一个典型的单线程服务器示例如下: while (true) { Socket socket = null; try { // 接收客户连接 socket = serverSocket.accept(); // 从socket中获得输入流与输出流,与客户通信 … } catch(IOException e) { e.printStackTrace() } …

    Java 2023年5月3日
    00
  • java 创建线程的四种方式

    当需要创建多个任务并行执行时,我们可以通过创建线程来实现。Java中创建线程有四种方式,分别是继承Thread类、实现Runnable接口、实现Callable接口并使用FutureTask包装器把Callable装载成一个线程、使用Executor框架创建线程池。下面依次介绍这四种方式: 继承Thread类 我们可以继承Thread类并重写run()方法实…

    Java 2023年5月18日
    00
  • java中的tostring方法的具体用法

    下面是关于Java中toString方法的详细解释: 什么是toString方法? 在Java中,toString方法是一个对象的一个内置方法,它可以将对象转换为字符串表示形式。默认情况下,该方法返回的字符串包含该对象的类名和hash code值。这时我们通常需要自定义该方法,以便输出我们所需要的信息。 如何重写toString方法? 要重写toString…

    Java 2023年5月26日
    00
  • form表单回写技术java实现

    下面是“form表单回写技术java实现”的完整攻略。 1. 什么是form表单回写技术 form表单回写技术是指在在用户提交表单时,如果表单有数据验证不通过或者其他原因导致提交失败,那么网页应该保留用户之前提交的数据,并在页面上回显给用户以方便用户修改。这就是form表单回写技术。 常见的web框架都提供了这种功能,例如Spring MVC框架的Bindi…

    Java 2023年6月16日
    00
  • JAVA帮助文档全系列 JDK1.5 JDK1.6 JDK1.7 官方中英完整版整理

    JAVA帮助文档全系列 JDK1.5 JDK1.6 JDK1.7 官方中英完整版整理 Java是一门非常流行的编程语言,并且拥有着相当完备的文档支持。首先需要明确的是,JDK(Java Development Kit)是JAVA开发工具包,其中包含了许多与开发相关的工具和应用程序。因此,JDK中所包含的文档,便是JAVA开发者苦苦寻找的官方文档。下面介绍如何…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部