首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java LinkedList 简单源码分析节选

——有序的 collection(也称为序列) 实现这个接口的用户以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。...,直接调用 linkLast 放在尾部 if (index == size) linkLast(element); else // 添加在链表中间...,然后再带参构造函数赋值的时候,以头节点做为后继节点 如果链表为空,则头尾部节点就都是这个新节点 newNode 如果不为空,则将头节点的前驱指针指向新节点,也就是指向前一个元素 2.5.5 addAll...return x; } } 2.6.2 获取头结点方法 public E getFirst() { final Node f = first; // 为空抛异常...null) throw new NoSuchElementException(); return f.item; } public E element() { // 为空抛异常

30120
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Python中list总结

    从右至左,从-1开始 正负索引不可以超界,否则引起IndexError 约定:可以认为列表是从左至右排列,左边是头部,右边是尾部,左边是下界,右边是上界 列表通过索引访问。...) 靠值遍历的方式 没有查找到数值不抛出异常。...返回列表中匹配value的次数 时间复杂度 遍历查找的都是O(n),index和count方法都是O(n) len () 统计列表的长度方法 6:列表元素的修改方法 list[index]=value...时间复杂度是O(1) +----->list 创建一个没有引用的新对象,之后会被垃圾回收 链接操作,将两个列表连接起来,原列表不会改变,会产生新的列表 本质上是调用——add_()方法 *------...清除列表所有元素,剩下一个空列表 8:列表的其他操作 reverse()-->None reverse将列表的元素反转,放回None 直接修改列表。

    1.1K10

    你不知道的LinkedList(一):基于jdk1.8的LinkdeList源码分析

    首先我们在LinkedList中添加1,由于最开始这个List为空,因此添加1的时候会导致fist和last都指向这个节点,Node上的next和prev值为空。 ?...否则返回IndexOutOfBoundsException异常。 之后再调用上文提到的node方法。...addFirst(E e) 在队列头部添加元素。 addLast(E e) 在队列尾部添加元素。 boolean offerFirst(E e) 在队列头部插入元素,并返回true。...E pollFirst() 取出队列头部元素。并在队列中删除。 E pollLast() 取出队列尾部元素。并在队列中删除。 E getFirst() 得到队列头部元素。不改变队列。...如果队列为空 抛出异常。 E getLast()得到队列尾部元素,不改变队列。如果队列为空则抛出异常。 E peekFirst()得到队列头部元素,不改变队列,如果为空则返回null。

    41810

    (39) 剖析LinkedList 计算机程序的思维逻辑

    在队列为空时,element和remove会抛出异常NoSuchElementException,而peek和poll返回特殊值null,在队列为满时,add会抛出异常IllegalStateException...pop表示出栈,返回头部元素,并且从栈中删除,如果栈为空,会抛出异常NoSuchElementException。 peek查看栈头部元素,不修改栈,如果栈为空,返回null。...,但尾部只添加、头部只查看和删除,有一个更为通用的操作两端的接口Deque,Deque扩展了Queue,包括了栈的操作方法,此外,它还有如下更为明确的操作两端的方法: void addFirst(E e...与队列类似,每种操作有两种形式,区别也是在队列为空或满时,处理不同。为空时,getXXX/removeXXX会抛出异常,而peekXXX/pollXXX会返回null。...插入元素 add是在尾部添加元素,如果在头部或中间插入元素呢?

    81180

    JAVA实现队列的应用

    2.队列的介绍 1.队列是一个有序列表,可以用数组或者链表来实现。 2.队列遵循先进先出的原则,即先进入队列的元素先出去,后进入队列的元素后出去。...在每次取出数值时,应该判断数组是否为空,若不是则头部索引应该减去1....("队列为空"); } front++; return arr[front]; } 当然这里如果为空也可以直接打印“队列为空”,但是会产生异常如图...,无法使用,导致此队列只能用一次,所以我们因该将头部与尾部索引将其改变,所以得用到循环队列。...小编这里规定头部与尾部索引都为0,判断是否为满时,尾部索引加一取maxsize的模时等于头部索引,注意,在加入和取出数据时,对应索引的更新时都要取模。

    11910

    5.6(java学习笔记) queue

    队列还提供额外的插入、提取和检查操作。这些方法都以两种形式存在:一种在操作失败时抛出异常,另一种返回特殊值(根据操作,为空或为假)。 后一种形式的插入操作是专门针对容量受限的队列实现设计的 ?...2.E poll() 检索并移除队列的头部,返回移除的队列头部元素,如果头部为空则返回null。...offer()最后调用的是addLast,tail是尾部的索引,我们可以看到将元素添加到尾部后, 尾部索引后移一位。 我们接着来看下poll(); ? ?...移除元素就将头部元素给result,然后判断下如果头部为空则返回null. 后面将头部置null,然后返回头部元素,头部索引后移一位。...还是上列代码,我们只需要修改一个地方就可以了,将从头部开始移除并返回移除元素,改成从尾部开始移除,并返回尾部元素即可。

    26330

    LinkedList源码分析(基于Java8)内部结构构造方法添加2检索3删除4迭代器5 例子6总结

    LinkedList是一个实现了List接口和Deque接口的双端链表 有关索引的操作可能从链表头开始遍历到链表尾部,也可能从尾部遍历到链表头部,这取决于看索引更靠近哪一端。...,也可以将元素添加到指定索引位置,还可以添加添加整个集合;另外既可以在头部添加,又可以在尾部添加。...检查index的范围,否则抛出异常 2. 如果插入位置是链表尾部,那么调用linkLast方 3....,是抛异常还是返回null 主要方法有getFirst()、element()、peek()、peekFirst() 其中getFirst()和element()方法将会在链表为空时,抛出异常...()内部调用了removeFirst() 而removeFirst()在链表为空时将抛出NoSuchElementException poll()和,pollFirst() 在链表为空时将返回null

    95740

    Java 集合框架(3)---- List 相关类解析(下)

    异常 */ E remove(); /** * 取出队列头部元素,并且将这个元素从队列中移除, * 和 remove() 方法的区别是如果队列为空,那么返回...NoSuchElementException 异常 */ E removeFirst(); /** * 移除并返回双端队列的尾部元素,如果队列已空,那么抛出一个...NoSuchElementException 异常 */ E removeLast(); /** * 移除并返回双端队列头部的元素,如果队列已空,那么放回 null...而不抛出异常 */ E pollFirst(); /** * 移除并返回双端队列尾部的元素,如果队列已空,那么返回 null 而不抛出异常 */...,如果队列已空,那么返回 null 而不抛出异常 */ E peekLast(); // ... } 和 Queue 中的方法在逻辑上有点类似,只不过这里是 双端队列,可以对队列头部和尾部进行操作

    66640

    Java集合--Queue(Java中实现2)

    boolean offerFirst(E e); //将指定元素添加到双端队列的尾部(如果队列满了,则抛出异常) void addLast(E e); //将指定元素添加到双端队列的尾部...(); //获取并删除双端队列的第一个元素(如果双端队列为空,则返回null) E pollFirst(); //获取并删除该双端队列的最后一个元素(如果双端队列为空,则抛出异常...(如果双端队列为空,则抛出异常) E getFirst(); //获取但不删除双端队列的第一个元素(如果双端队列为空,则返回null) E peekFirst();...//获取但不删除双端队列的最后一个元素(如果双端队列为空,则抛出异常) E getLast(); //获取但不删除双端队列的最后一个元素(如果双端队列为空,则返回null) E...而在Deque中,实现了两个进入端、两个输出端--即可在头部输出也可输入,即可在尾部输出也可在尾部输入。

    1.4K50

    【数据结构】—— 队列基础知识以及数组模拟队列

    1)队列是一个有序列表,可以用数组或是链表来实现 2)遵循先入先出的原则。即先存入队列的数据要先取出,后存入队列的数据要后取出。...(加数据是在队列的尾部加,取数据是在队列的首部取) 数组模拟队列 分析 (1)队列本身是一个有序列表,若使用数组的结构来存储队列的数据,则队列数的声明如下图,其中maxSize表示该队列的最大容量。...(2)因为队列的输出和输入是分别从此队列的前后端来处理的,因此需要两个变量 front 和 rear 分别记录队列前后端的下标,front 会随着数据输出二改变,rear 则是随着数据输入而改变。...= arrMaxSize;//将队列的长度赋值 arr = new int[maxSize];;//创建长度为maxSize的数组 front = -1;//指向队列的头部...if(isEmpty()) { //如果为空就抛出异常 throw new RuntimeException("队列为空,不可以读取数据"

    20030

    【Java入门提高篇】Day27 Java容器类详解(九)LinkedList详解

    /** * 取回并删除此列表的头部(第一个元素)。...element()会在没元素时抛出异常:NoSuchElementException;  peek()返回null; 删除头部元素 (remove, poll),返回头部元素,并且从队列中删除,remove....)); * * 该类的iterator方法和listIterator方法返回的迭代器是“fail-fast”的,如果列表在迭代器创建之后的任何时刻被进行 * 结构性的修改了,则调用迭代器自身的remove...如果列表大小适合指定的数组,则返回该数组。 否则,将为新数组分配指定 * 数组的运行时类型和此列表的大小。...* * 如果列表的空间适合指定的数组(数组比列表有更多的元素),紧跟在列表末尾之后的数组中的元素设置 * 为null(仅当调用者知道列表不包含任何null元素时,这在确定列表长度时很有用

    53830

    Java源码阅读之LinkedList - JDK1.8

    * (注意,如果指定的集合是该列表,并且它不是空的,则会发生这种情况。) * 其实就是线程不安全。...(); //调用unlinkFirst,后面和unlink一起分析 return unlinkFirst(f); } /** * 移除并返回尾部元素 * * @return 返回...list尾元素 * @throws NoSuchElementException list为空时,抛异常 */ public E removeLast() { final Node l...一起分析 return unlinkLast(l); } /** * 从list头部->尾部进行遍历,如果存在指定元素的话,则移除第一个匹配的元素,如果不存在,则list不改变 * *...remove(o),因为remove(o)就是从头部遍历并移除第一个匹配的元素 return remove(o); } /** * 从list尾部->头部进行遍历,如果存在指定元素的话,则移除第一个匹配的元素

    45220

    面试官系统精讲Java源码及大厂真题 - 06 LinkedList 源码解析

    last = newNode;     //如果链表为空(l 是尾节点,尾节点为空,链表即空),头部和尾部是同一个节点,都是新建的节点     if (l == null)        ...f.prev = newNode;     size++;     modCount++; } 头部追加节点和尾部追加节点非常类似,只是前者是移动头节点的 prev 指向,后者是移动尾节点的 next...2.2 节点删除 节点删除的方式和追加类似,我们可以选择从头部删除,也可以选择从尾部删除,删除操作会把节点的值,前后指向节点都置为 null,帮助 GC 进行回收。...两种方向的使用方式,但当链表为空时的表现都和 remove 方法一样,都会抛出异常。...:     // lastReturned 为空,说明调用者没有主动执行过 next() 或者 previos(),直接报错     // lastReturned 不为空,是在上次执行 next(

    36043

    Java并发阻塞队列之ArrayBlockingQueue

    ArrayBlockingQueue函数列表 // 创建一个带有给定的(固定)容量和默认访问策略的ArrayBlockingQueue。...E peek() // 获取并移除此队列的头,如果此队列为空,则返回null。 E poll() // 获取并移除此队列的头部,在指定的等待时间前等待可用的元素(如果有必要)。...- add(E e) :如果立即可行且不会超过该队列的容量,将指定的元素插入到队列的尾部。成功返回true,队列已满则抛出IllegalStateException(“Queue full”)异常。...可以看出,父类方法调用offer之后,如果offer返回false,则表示队列已满,父类方法会抛出异常。 而offer方法首先校验添加的对象是否为null,如果null则直接抛出空指针异常。...take() :获取并移除此队列的头部,如果队列为空,则一直等待可用元素,也就是说必须要拿到一个元素,除非线程中断。

    39820

    基础篇:JAVA集合,面试专用

    不存在则报错 ArrayList 和 LinkedList 使用场景 频繁访问列表中的某一个元素,或者需要在列表末尾进行添加和删除元素操作,用ArrayList 频繁的在列表开头、中间、末尾等位置进行添加和删除元素操作...HashMap和双向链表合二为一即是LinkedHashMap WeakHashMap WeakHashMap 也是一个散列表,它存储的内容也是键值对(key-value)映射,而且键和值都可以是 null...通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利。...当生产者线程调用put之类的方法加入元素时,会触发 Delayed 接口中的compareTo方法进行排序 消费者线程查看队列头部的元素,注意是查看不是取出。...void addLast(E e); //加入尾部 boolean offerFirst(E e); //加入头部,并返回结果 boolean offerLast(E e); //加入尾部,并返回结果

    46620

    Java集合--阻塞队列(ArrayBlockingQueue)

    //向队列尾部添加元素,如果队列满了,则线程等待 public void put(E e) throws InterruptedException { //不能插入非空元素,会抛出异常...//向队列尾部添加元素,队列满了返回false public boolean offer(E e) { //不能插入非空元素,会抛出异常 checkNotNull(e); //上锁...该方法在插入时候,如果队列中的元素满了,则会抛出异常。如果插入成功,则返回true。 在add(E e)中,使用父类的add(E e),实际上其底层也是调用的offer(E e)方法。...//向队列尾部添加元素,队列满了抛出异常; public boolean add(E e) { return super.add(e); } ArrayBlockingQueue中,最底层的插入方法...} finally { lock.unlock(); } } //获取队列头部元素,如果队列为空,则设置线程等待时间,超过指定时间,还为空,则返回

    4.7K40

    Redis中的list学习笔记

    lpush、rpush lpush可以向指定的list左边(头部)添加新元素,并返回添加的元素个数 rpush可以向指定的list右边(尾部)添加新元素,并返回添加的元素个数 127.0.0.1:6379...如果 end 超过列表尾部,Redis 会将其当作列表的最后一个元素。 ltrim 的一个常见用法是和 lpush/ rpush 一起使用。...list的阻塞行为 可以使用list实现生产-消费者模式,如果使用lpush、rpop在队列头部插入元素、队列尾部取出元素。...blpop 当blpop调用时,如果给定 key 内至少有一个非空列表,那么弹出遇到的第一个非空列表的头元素,并和被弹出元素所属的列表的名字 key 一起,组成结果返回给调用者。...一旦有新的数据出现在其中一个列表里,那么这个命令会解除阻塞状态,并且返回 key 和弹出的元素值。

    26120
    领券