`

java集合之LinkedList

阅读更多
首先java中的集合从存储数据上来说分为2种。一种是存放单个值的,另外一种是存放键值对的。
存放单个值的上级接口是Collection接口。同时jdk提供了一个对于集合操作的辅助类Collections。Collection暴露了一些简单的接口。

boolean add(E e);
boolean remove(Object o);
boolean addAll(Collection<? extends E> c);
boolean removeAll(Collection<?> c);
Object[] toArray();
Iterator<E> iterator();
boolean contains(Object o);
boolean isEmpty();
int size();

接着在看看基于双向链表结构的LinkedList类
特点:每个节点都知道前一个节点和后一个节点
优点:对于插入时只需要修改插入节点的引用和对应节点的引用即可,因此插入效率比基于数组的ArrayList高(ArrayList需要先进行插入元素的位置寻找,然后再进行数组元素的移动,最后插入元素(如果数组长度不够大还需要数组大小的扩展))。
缺点:查找效率较低,需要从header进行查找遍历,而ArrayList或是根据数组下标或是根据元素(以为根据元素的会使用hash算法所以效率相对较高)

下面看看LinkedList类的常用方法以及实现原理
public LinkedList() {
        header.next = header.previous = header;
}
首先发现该类的默认的构造方法,是将内部定义的一个Entry<E> header,将前节点的引用和后节点的引用都指向自身。

1.public boolean add(E e)
内部的实现代码如下
public boolean add(E e) {
addBefore(e, header);
        return true;
}
即添加时每次都是将第二个参数传入header。header就有点像织毛衣的针一样
再看看addBefore的代码的实现
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;
}
//解释:将新添加的节点的next指向header节点。将新添加元素的previous指向header的previous。然后再将新添加元素的previous的next指向新添加元素。再将新添加元素的next的previous指向新添加元素(实际上就是header的previous指向新添加元素)
最后让大小加一,返回新添加的entry对象
2.public boolean remove(Object o)方法
//再看看删除操作的实现原理
public boolean remove(Object o) {
        if (o==null) {
         for(Entry<E> e = header.next; e != header; e = e.next){
                if (e.element==null) {
                    remove(e);
                    return true;
                }
            }
        } else {
         for(Entry<E> e = header.next; e != header; e =e.next){
                if (o.equals(e.element)) {
                    remove(e);
                    return true;
                }
          }
        }
        return false;
    }
//因为链表实际上是通过Entry链接到一起组成的链表,因此查找时需要从第一个Entry开始查找,即header的next。当找到指定的entry,这进行节点的移除
相关代码如下:
private E remove(Entry<E> e) {
if (e == header)
    throw new NoSuchElementException();

        E result = e.element;
e.previous.next = e.next;
e.next.previous = e.previous;
        e.next = e.previous = null;
        e.element = null;
size--;
modCount++;
        return result;
    }
即让当前节点的previous的next指向当前节点的next,当前节点的next的previous指向当前节点的previous

header节点的内容节点和previous和next均为空

常用方法
public void addLast(E e)
其实和add是一样的

再看看里面的clone方法
public Object clone() {
        LinkedList<E> clone = null;
try {
    clone = (LinkedList<E>) super.clone();
} catch (CloneNotSupportedException e) {
    throw new InternalError();
}

        // Put clone into "virgin" state
        clone.header = new Entry<E>(null, null, null);
        clone.header.next = clone.header.previous = clone.header;
        clone.size = 0;
        clone.modCount = 0;

        // Initialize clone with our elements
        for (Entry<E> e = header.next; e != header; e = e.next)
            clone.add(e.element);

        return clone;
    }
为了实现深度克隆,该类实现了Cloneable接口。并重写了clone方法
之所以重写是为了让该对象支持深层次克隆
要想让对象完全支持深度克隆需要对象内部的复杂成员类型也支持深度克隆,否则修改克隆对象的对象成员变量会让原来的对象受到影响。如果原来元素不支持可以像上面重新方法一样,新创建成员变量,并将原来成员变量的值传入新创建的成员变量当中。
分享到:
评论

相关推荐

    Java 集合之LinkedList源码分析

    Java API中提供了链表的Java实现—LinkedList下。LinkedList是通过节点的连接实现链表的数据结构,向linkedList中插入或删除元素的速度是特别快,而随机访问的速度相对较慢,这个是由于链表本身的性质造成的,在链表...

    java集合-LinkedList的使用

    基于双向链表实现的列表,支持在任意位置的插入和删除操作。

    Java集合系列(LinkedHashMap+LinkedList+ArrayList)

    Java 集合系列(LinkedHashMap+LinkedList+ArrayList) Java 集合系列是 Java 语言中的一种数据结构,用于存储和操作数据。今天,我们将介绍 Java 集合系列中的三个重要成员:LinkedHashMap、LinkedList 和 ArrayList...

    java中LinkedList集合类实现栈和队列.doc

    在Java编程语言中,LinkedList集合类是一个非常重要的数据结构,它可以用来实现栈和队列这两种特殊的数据结构。LinkedList是一个双链表,每个节点包含数据元素和两个引用,分别指向前后节点,这使得在列表中进行插入...

    Java集合框架LinkedList详解及实例

    《Java集合框架LinkedList详解及实例》 在Java编程语言中,集合框架是处理对象集合的重要工具,而LinkedList是这个框架中的一个重要组成部分。LinkedList是一种双端链表,它不仅提供了列表的基本功能,还支持高效的...

    java集合思维导图

    Java集合框架是Java编程语言中的一个核心部分,它为数据存储和管理提供了高效且灵活的解决方案。本思维导图及总结旨在深入理解并掌握Java集合的相关概念和使用方法。 首先,我们来了解一下Java集合框架的基本构成。...

    简单了解java集合框架LinkedList使用方法

    "Java集合框架LinkedList使用方法" Java集合框架中的LinkedList是一个双向链表,具有链表底层实现的特点,查询速度慢,增删速度快。LinkedList是Java集合框架中的一个重要组件,广泛应用于各种软件系统中。本文将...

    JAVA利用LinkedList构造栈与队列

    在Java编程语言中,LinkedList是一个常用的集合类,它实现了List接口,同时也提供了双向链表的实现。LinkedList不仅可以作为列表使用,还可以被巧妙地利用来构建栈(Stack)和队列(Queue)这两种基本数据结构。在本...

    java 集合

    本文将深入探讨Java集合框架的基础知识,包括接口、类、以及它们在实际开发中的应用。 首先,Java集合框架由一系列接口和实现这些接口的类组成。主要的接口有`List`、`Set`和`Queue`,它们各自代表了不同特性的数据...

    Java集合思维导图.xmind.zip

    以下是关于Java集合类,特别是HashMap、CurrentHashMap、ArrayList和LinkedList的详细知识点: 1. **HashMap**: HashMap是Java中最基本的键值对存储结构,基于哈希表实现。它提供了快速的插入、删除和查找操作,...

    Java集合系列之LinkedList源码分析

    Java集合系列之LinkedList源码分析 概述: 本文详细介绍了Java集合系列之LinkedList的源码分析,主要介绍了LinkedList的底层实现、成员变量、构造器、增删改查方法等。LinkedList是一种基于双向链表的数据结构,...

    Java集合排序及java集合类详解.pdf

    Collection是Java集合框架中最重要的接口之一,它是所有单列集合的根接口。 ##### 1.2 Collection - **常用方法**: - `add(E e)`:向集合添加一个元素。 - `remove(Object o)`:从集合中移除指定元素。 - `...

    java泛型集合 java集合 集合 java Collection

    Java集合框架是一个包含多种数据结构(如列表、集、队列等)的API,这些数据结构由接口(如`Collection`、`List`、`Set`和`Queue`)和实现这些接口的类(如`ArrayList`、`HashSet`和`LinkedList`)组成。`Collection...

    Java集合排序及java集合类详解

    Java集合框架是Java编程语言中的一个核心组成部分,它为数据存储和操作提供了丰富的接口和类。在本篇中,我们将深入探讨Java集合的排序机制以及集合类的详细使用。 首先,我们来了解一下Java集合的基本分类。Java...

    java集合类详解(set list ArrayList等java集合类详述)

    Java 集合类详解 Java 集合类是 Java 语言中的一种基本数据结构,用于存储和操作大量数据。集合类可以分为三大类:Collection、List 和 Set。 Collection 是集合框架中的根接口,提供了基本的集合操作,如 add、...

    java之LinkedList操作

    ### Java之LinkedList操作详解 #### 一、简介 在Java编程语言中,`LinkedList`是`java.util`包下的一个接口实现,它继承了`List`接口,内部使用双向链表来存储元素。与`ArrayList`相比,`LinkedList`更适用于频繁...

    一个讲解很清晰的Java集合框架PPT

    Java集合框架是Java编程语言中不可或缺的一部分,它提供了一组接口和类,用于高效地存储、管理和操作数据。这个“一个讲解很清晰的Java集合框架PPT”显然是一个对外公开的教育资源,旨在帮助学习者深入理解Java集合...

    Java中集合LinkedList的原理与使用方法

    LinkedList是Java集合框架中List接口的一个实现,它是一种基于链表结构的数据容器。本文将深入探讨LinkedList的原理和使用方法。 首先,LinkedList是一个双向链表,意味着每个元素(节点)都有指向前后元素的引用。...

    Java集合 练习代码

    本练习代码主要围绕Java集合框架展开,包括ArrayList、LinkedList、HashSet、HashMap等各种类型的集合以及它们的使用方法。通过这些代码示例,我们可以深入理解Java集合的各种特性和操作。 首先,我们来探讨...

Global site tag (gtag.js) - Google Analytics