Java自带的LinkedList的实现的方式,可以说是最高效的。
可以分析一下其他的实现方式:
1.如果我们用只有一个头指针的单链表的方式实现LinkedList,那么在链表的末尾进行的操作效率就不是很高,例如,我们在链表的末尾的增加一个元素的操作,或者删除一个元素的操作,时间负责度都为O(n)。那么如果增加一个尾指针呢,是不是就可以实现效率高的操作了?
public boolean addLast(Object element){
Entry temp=new Entry();
temp.element=element;
temp.next=null;
if(head==null)
head=tail=temp;
else{
tail.next=temp;
tail=temp;
}
return true;
}
此方法的时间复杂度为O(1),常量。
但是,如果我们要删除末尾的一个元素呢?现在仍然需要O(n)的时间。
2.改进:我们使用一个带有头尾指针的双链表来实现
public boolean addLast(Object element){
Entry temp=new Entry(element,null,tail);
if(head==null){
head=tail=temp;
}
else{
tail=tail.next=temp;
}
size++;
modCount++;
return true;
}
可见,这种实现方式也是比较麻烦的
原来的LinkedList的实现就一句话:
public void addLast(Object o){
addBefore(o,header);
}
public Object removeLast(){
if(head==null)//空链表
throw new NoSuchElementException();
Object last=tail.element;
if(head==tail)//仅仅一个元素在List里
head=tail=null;
else{
tail=tail.previous;
tail.next=null;
}
size--;
modCount++;
return Last;
}
总的来说,这种实现方式,在书写代码时,需要head.previous和tail.next为null的情况。
3.使用带头尾指针的双循环链表
这种实现方式,我们需要注意链表为空插入元素或者只有一个元素时删除元素的问题。
private Entry<E> addBefore(E e, Entry<E> entry) {
Entry<E> newEntry = new Entry<E>(e, entry, entry.previous);
newEntry.previous.next = newEntry;
newEntry.next.previous = newEntry;
size++;
modCount++;
return newEntry;
}
public boolean addLast(Object element){
if(head==null){
Entry temp=new Entry(null,element,null);
head=tail=temp.next=temp.previous=temp;
size++;
modCount++;
}else
tail=addBefore=(element,head);
return true;
}
public Object removeLast(){
Object last=tail.element;
remove(tail);
return last;
}
public void remove(Entry e){
if(e==null)
throw new NoSuchElementException();
if(tail==head)
head=tail=null;
else{
e.previous.next=e.next;
e.next.previous=e.previous;
if(e==tail)
tail=tail.previous;
}
size--;
modCount++;
}
从上面的分析可以看出,Java里的LinkedList的实现方式是非常好的。其他的实现要么性能难以达到要求,要么实现相对复杂一些。
分享到:
相关推荐
《Java源码解读-ITG-JavaBook01: Java面试高频源码解读》是一部针对Java程序员面试准备的深入学习资料。在这个项目中,我们将会探索Java语言的一些核心概念和常用库的源代码,帮助开发者更好地理解Java的内部机制,...
在Java面试中,源码解读是一项重要的能力,它考察了开发者对Java语言底层实现的理解以及问题解决的能力。这里我们将深入探讨三道常见的Java面试题,它们涵盖了基础、并发和集合框架等方面,帮助你提升对Java源码的...
3. 集合框架:ArrayList、LinkedList、HashMap等数据结构的实现,以及它们在不同场景下的性能差异。 4. 多线程:Java并发库的使用,如synchronized、volatile、ThreadLocal等关键字,以及ExecutorService和Future...
作者目录Java基础Java基础学习(1)——引用Java基础学习(2)——注解Java基础学习(3)——泛型Java基础学习(4)——动态代理《Java多线程核心技术》读书笔记JDK源Java集合框架源码解读(1)——ArrayList、LinkedList和...
Java集合框架源码解读(1)——ArrayList、LinkedList和Vector Java集合框架源码解读(2)——HashMap Java集合框架源码解读(3)——LinkedHashMap Java集合框架源码解读(4)——WeakHashMap Java集合框架源码解读
本篇文章将对Java API的部分关键组件进行源码解读,帮助读者深入理解其工作原理。 1. **对象创建与内存管理**: - `Object`类:所有Java类的基类,包含了如`clone()`, `equals()`, `hashCode()`等方法。理解`...
在"java集合源码-analysis:java集合源码解析"这个项目中,我们主要探讨的是对Java集合框架的源码进行深入理解。下面将详细阐述Java集合框架的基本概念、重要类和接口,以及其源码分析的重要性。 Java集合框架主要...
总之,"Java8-basic-source-code-interpretation"项目旨在通过源码解读,帮助开发者深入理解`int`在Java 8中的各种使用场景、操作方式以及相关的新特性。通过对这个项目的探索,开发者可以提升自己在Java编程中的...
java所有集合类底层源码解析汇总,包括ArrayList、HashMap、HashSet、LinkedList、TreeMap、HashSet、ConcurrentHashMap等集合框架的底层实现源码大白话解读。
4. **集合框架**:Java集合框架是存储和操作对象的重要工具,包括ArrayList、LinkedList、HashSet、HashMap等。学习笔记会详细解析各种集合类的特性和使用场景。 5. **输入/输出(I/O)**:Java I/O流用于读写文件、...
java forkjoin 源码 -- -- geomesa -- spring -- 算法 -- hbase -- 数据库 -- 高并发 [Java Memory Modle内存模型] [指令重排,可见性,原子性,顺序一致性] 并发同步处理 [乐观锁&悲观锁,重入锁&非重入锁,公平锁&...
数组是存储固定数量相同类型元素的数据结构,而集合框架包括ArrayList、LinkedList、HashSet、HashMap等,它们提供了更加灵活的数据存储和操作方式。 4. **第09章** - 可能讲解异常处理,这是Java程序中的重要部分...
3. **集合框架**:在订单处理系统中,可能会用到ArrayList、LinkedList、HashMap等集合类来存储和管理订单数据。理解如何操作这些集合,以及它们各自的性能特点,对分析源码很有帮助。 4. **多线程**:Java提供了...
源码解读是提升技术水平的重要途径。例如,深入理解HashMap和ConcurrentHashMap的实现,可以让我们更好地利用这些数据结构,避免性能瓶颈;阅读ArrayList和LinkedList的源码,有助于我们选择合适的数据结构以优化...
Java中的LinkedList是一个实现了List接口的双向链表数据结构。它提供了高效的插入和删除操作,但随机访问性能相对较差。LinkedList的实现方式使得它在需要频繁进行添加、删除操作且顺序访问较多的场景下表现优越。 ...
本文将围绕达内的Core Java培训源码,对其中的关键知识点进行详细解读。 一、Java基础 1. 类与对象:Java是一种面向对象的语言,类是对象的模板,对象则是类的实例。理解类的定义、对象的创建及成员变量和方法的...
《Java源码解读——深入理解JDK》 Java作为一门广泛应用的编程语言,其源码是许多开发者探索技术原理、提升编程技能的重要资源。"java源码解读-jdk_reading:java源码日常阅读与注解"项目,旨在帮助开发者深入理解...
Java作为一门广泛使用的编程语言,其底层知识点和源码解读对于深入理解并优化代码性能至关重要。本主题将探讨以下几个方面: 1. **Java虚拟机(JVM)**: JVM是Java程序运行的基础,它负责字节码的解释执行,内存...
6. **集合框架**:20章可能详细解读了Java集合框架,包括List(ArrayList、LinkedList)、Set(HashSet、TreeSet)、Map(HashMap、LinkedHashMap)以及它们之间的关系和选择原则。 7. **IO与NIO**:21章可能深入...
- `ArrayList`, `LinkedList`, `HashSet`, `HashMap`等集合类的使用,展示了Java集合框架的强大功能,包括动态扩容、迭代器、泛型等。 7. **多线程**: - `Thread`类的子类化,`Runnable`接口的实现,线程同步...