Java中LinkedList笔记

之前写程序似乎也没有怎么关注过底层的结构,最近正好遇到了链表的问题,于是仔细阅读了Java中链表的实现LinkedList

简单记录一下看完的总结:

1.LinkedList中定义了一个类型Node<E> ,包括3个属性,即Node中封装的元素item,当前元素的前一个元素引用和后一个元素引用prev/next,和链表定义一直,没什么新鲜

    private static class Node<E> {
        E item;
        Node<E> next;
        Node<E> prev;
        Node(Node<E> prev, E element, Node<E> next) {
            this.item = element;
            this.next = next;
            this.prev = prev;
        }
    }

2.链表的特点是在首尾添加内容比较快捷,所以LinkedList除了实现List接口的add/remove外,还增加了在首尾增加元素的方法addFirst/addList ,removeFirst,removeLast,以及getFirst,getLast获取首尾元素的方法

3.List接口中得get/remove/add等操作实际上都是操作链表的最末尾

其中我一直想知道的是链表中对List接口中得get(index)方法是如何实现的,或者说现实容易,有什么优化呢,看了源代码,发现原来优化的内容并没有我想像的高端,具体是:

 首先,看index位于的链表的前一半还是后一半(对size>>1 得出中间数,然后判断index和size>>1的关系得知)

然后,如果index在链表的前半部分,就正向遍历,如果index在链表的后半段,则是从末尾开始遍历

这是LinkedList中根据给定的索引index获取元素的实现:

Node<E> node(int index) {
        // assert isElementIndex(index);
        if (index < (size >> 1)) {
            Node<E> x = first;
            for (int i = 0; i < index; i++)
                x = x.next;
            return x;
        } else {
            Node<E> x = last;
            for (int i = size - 1; i > index; i--)
                x = x.prev;
            return x;
        }
    }

当打算源代码的时候,如果其中的大部分内容已经知道个大概了,只有一些细节不清楚,这种状态下,收获最大,完全不知道,或者完全知道的时候,看源代码都没有什么意思,这是一直以来我的学习心得。

时间: 2024-11-12 14:48:23

Java中LinkedList笔记的相关文章

Java中LinkedList的remove方法真的耗时O(1)吗?

这个问题其实来源于Leetcode的一道题目,也就是上一篇日志 LRU Cache.在使用LinkedList超时后,换成ArrayList居然AC了,而问题居然是在于List.remove(Object o)这个方法. 我们知道,链表和数组相比,最主要的特点就是add和remove的操作是O(1)的.Java中的链表一般使用LinkedList这个类型,数组一般使用ArrayList.它们同时implements了List这个interface,所以都有remove(int index)和re

【数据结构】java中LinkedList学习总结

一.LinkedList实现原理概述 LinkedList 和 ArrayList 一样,都实现了 List 接口,但其内部的数据结构有本质的不同.LinkedList 是基于链表实现的(通过名字也能区分开来),所以它的插入和删除操作比 ArrayList 更加高效.但也是由于其为基于链表的,所以随机访问的效率要比 ArrayList 差. 二.LinkedList类定义 public class LinkedList<E> extends AbstractSequentialList<

java中LinkedList的遍历速度

我想比较一下用Iterator.for语句.foreach来遍历LinkedList,谁的速度快.于是写了如下代码: package mystudy; import java.util.*; public class MyStudy {     private static final int SIZE = 100000;     private Integer[] arr = new Integer[SIZE];     private AbstractList<Integer> absLi

Java中LinkedList和ArrayList的区别

首先亮一下他们两个基本区别,面试的时候可以用来和面试官唠嗑啊 1.ArrayList实现了基本动态数组结构,Linked基于链表的结构.链表?什么是链表?答:"链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中指针连接次序实现的"注:此句话通过了科普中国百科科学词条编写与应用工作项目的审核. 2.对于get和set,ArrayList的性能优于LinkedList,因为Linked要移动指针,麻烦的很 3.对于add和remove,LinkedList要优

【Java数据结构学习笔记之一】线性表的存储结构及其代码实现

应用程序后在那个的数据大致有四种基本的逻辑结构: 集合:数据元素之间只有"同属于一个集合"的关系 线性结构:数据元素之间存在一个对一个的关系 树形结构:数据元素之间存在一个对多个关系 图形结构或网状结构:数据元素之间存在多个对多个的关系 对于数据不同的逻辑结构,计算机在物理磁盘上通常有两种屋里存储结构 顺序存储结构 链式存储结构 本篇博文主要讲的是线性结构,而线性结构主要是线性表,非线性结构主要是树和图. 线性表的基本特征: 总存在唯一的第一个数据元素 总存在唯一的最后一个数据元素 除

6.Java集合-LinkedList实现原理及源码分析

Java中LinkedList的部分源码(本文针对1.7的源码) LinkedList的基本结构 jdk1.7之后,node节点取代了 entry ,带来的变化是,将1.6中的环形结构优化为了直线型链表结构,从双向循环链表变成了双向链表 在LinkedList中,我们把链子的"环"叫做"节点",每个节点都是同样的结构.节点与节点之间相连,构成了我们LinkedList的基本数据结构,也是LinkedList的核心. 我们再来看一下LinkedList在jdk1.6和

Java中ArrayList和LinkedList区别

一般大家都知道ArrayList和LinkedList的大致区别:      1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构.      2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针.      3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据. ArrayList和LinkedList是两个集合类,用于存储一系列的对象引用

Java中arraylist和linkedlist源代码分析与性能比較

Java中arraylist和linkedlist源代码分析与性能比較 1,简单介绍 在java开发中比較经常使用的数据结构是arraylist和linkedlist,本文主要从源代码角度分析arraylist和linkedlist的性能. 2,arraylist源代码分析 Arraylist底层的数据结构是一个对象数组.有一个size的成员变量标记数组中元素的个数,例如以下图: * The array buffer into which the elements of the ArrayLis

Java中的linkedList

Java中的LinkedList实际上是双向链表实现方式 LinkedList<String> list = new LinkedList<String>(); list.add(1); list.add(2) 1->2 这说明默认的add方式是在list的尾部添加了一个元素 list.addLast(3); 1->2->3 list.addFirst(0); 0->1->2->3 list.removeLast(); 0->1->2