`
wenjinglian
  • 浏览: 807022 次
  • 性别: Icon_minigender_1
  • 来自: 株洲->深圳
社区版块
存档分类
最新评论

了解LinkedList原理

阅读更多

1.LinkedList介绍

线性链表集合,循环链表http://blog.csdn.net/tiwerbao/article/details/8227689

非线程安全

底层实现:底层使用 Entry<E>实现  entry 有有三个元素 :

E element 当前元素

Entry<E> next  下个一元素

Entry<E> previous 上一个元素

不需要考虑集合大小与扩展

 

2.与其他集合对比

 参见:http://nassir.iteye.com/blog/1990523 

 

3.源码分析 

 

 public LinkedList() {
        header.next = header.previous = header; // 先初始化一个空的Entry,用来做header,然后首尾相连,形成一个循环链表
    }

 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;
    }


//查找
private Entry<E> entry(int index) {
        if (index < 0 || index >= size)
            throw new IndexOutOfBoundsException("Index: "+index+
                                                ", Size: "+size);
        Entry<E> e = header;
        if (index < (size >> 1)) {//size >> 1 相当于 size/2 通过index确定是向前还是向后查找
            for (int i = 0; i <= index; i++)
                e = e.next;
        } else {
            for (int i = size; i > index; i--)
                e = e.previous;
        }
        return e;
    }

final void checkForComodification() { //检测是否在并发
	    if (modCount != expectedModCount)
		throw new ConcurrentModificationException();
	}


 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;
    }

 

 

4.优化

 LinkedList 应用在新增和删除操作比较频繁场景

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    Java中的ArrayList的底层源码解读、LinkedList、Vector的区别介绍

    适用人群:JavaSE初学者,对源码感兴趣的,想要深度了解ArrayList底层实现、数据结构、add方法、Remove方法、以及自动扩容机制的同学,并且对ArrayList已经有过使用,想要学习它与LinkedList,Vector等的区别,该...

    LinkedList

    链表 本文档包含对数据结构的分配的描述。 从讲座中,您已经了解了什么是链接列表。 简而言之,它是一种动态数据结构,在向其中添加... 确保仔细阅读代码和注释,以了解模板的工作原理。 这将有助于您执行不同的操作。

    阿里面试经历感想回顾总结

    Java的数据结构相关的类实现原理,比如LinkedList,ArrayList,HashMap, TreeMap这一类的。以下简单模拟一个数据结构的连环炮。 比如,面试官先问你HashMap是不是有序的? 你肯定回答说,不是有序的。那面试官就会...

    android-7 面试知识点

    5、手写单例模式中的懒汉双重锁代码6、LaunchMode及其使用场景7、请手写一个冒泡排序8、Activity的启动过程9、请大概说一下你了解的Service10、说一下你了解的广播11、请说一下内容提供者12、Handler原理13、OKHttp...

    MaxHeap:我的最大堆类的存储库

    我认为在数据结构中,堆可能是最被低估的一种,因为人们有时倾向于在不了解其工作原理的情况下使用它,甚至在应该使用堆的地方滥用排序数组。 事实上,我们经常实现 LinkedList、BinarySearchTree 等,而不那么频繁...

    leetcode下载-Note:我的笔记

    需要了解其实现原理,还要灵活运用,如:自己实现 LinkedList、两个栈实现一个队列,数组实现栈,队列实现栈等。 内存模型 垃圾回收算法(JVM) 类加载过程(需要多看看,重在理解,对于热修复和插件化比较重要) ...

    Redis之基本数据结构

    文章目录Redis可以做什么Redis5种基本数据对象String字符串redis是...如果不能深入地了解系统,技术和框架背后的深层原理,很多问题无法理解到本质,更谈不上解决,临时抱佛脚也于事无补。 Redis可以做什么 记录帖子的

    Java面试题.docx

    10、string 转换成 integer的方式及原理 11-20题: 11、哪些情况下的对象会被垃圾回收机制处理掉? 12、静态代理和动态代理的区别,什么场景使用? 14、Java中实现多态的机制是什么? 16、说说你对Java反射的...

    JavaRushHomeWork:我的课程任务 javarush.ru

    了解泛型08 集合:LinkedList、HashSet。 哈希映射。 日期 - 日期。 09 引入异常:尝试。 捕获,抛出,多次捕获。 10 原始类型的铸造:膨胀和收缩。 11 OOP基础:基本原理、继承、封装。 12 个 OOP 基础:重载、...

    Java服务器端开发面试.doc

    Java服务器端开发面试题 Java服务器端开发面试题篇1 Hashcode()和equals(), 明白背后的原理,包括hashcode()的用法,各自的区别,如何,何时覆盖,为何覆盖 区别new String()和 申明的字符串的区别,String不变量,堆...

    java常用工具类的使用

    “工欲善其事,必先利其器”,在Java程序开发过程中,很多算法(比如:MD5加密算法)、很多数据结构(比如链表LinkedList)已经实现并且大多放在类库的java.util包中,程序员只需要了解各种工具的功能就可以直接调用...

    C++数据抽象和问题求解(第6版).[美]Frank M. Carrano(带详细书签).pdf

    这本经典、畅销的数据结构教材详细介绍了数据抽象的基础知识,强调作为面向对象方法基础原理的规范和实施之间的区别。书中使用的软件工程原则和概念以及UML图便于增强学生的理解。 ◆ 详细介绍了数据抽象,强调规范...

    JAVA面试题最全集

    描述Cookie和Session的作用,区别和各自的应用范围,Session工作原理。 5.列出Jsp中包含外部文件的方式,两者有何区别。 6.说明Jsp中errorPage的作用,应用范围。 7.介绍在Jsp中如何使用JavaBeans。 8.简单介绍...

    超级有影响力霸气的Java面试题大全文档

    抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。 2.继承:  继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确...

    java 面试题 总结

    抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。 2.继承: 继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性...

Global site tag (gtag.js) - Google Analytics