关于JDK1.7中LinkedList索引方法的思考

前几天无意中看到LinkedList的部分源码,发现一个很有趣的问题,跟大家一起分享一下。

首先LinkedList底层实现是双向链表,这个毫无疑问,地球人都知道,这就使得LinkedList有了链表结构的一些特性,我们在根据下标索引查找值得时候查看关键源码如下:

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

测试代码如下:

List<Object> list = new LinkedList<>();

list.add("aaa");
list.add("bbb");
list.add("ccc");
list.add("ddd");
list.add("eee");
System.out.println(list.size());
System.out.println(list.get(2));

上述代码,我在LinkedList中添加了五个元素,此时的size=5,get(2)=ccc。那么底层是如何去索引找到ccc的呢?

细读上面LinkedList源码中node方法可以发现,在检索的时候会有一个算法调优,根据索引值与size的比较来判断从前还是从后开始进行遍历。当index < (size >> 1)成立时,从前往后遍历,反之由后往前遍历。

上述测试用例当我get(2)的时候,表达式中index=2,size=5,5右移一位为5/1*2 = 2,表达式2<2显然不成立,程序将执行else的语句。

我们看一下LinkedList的链表结构:

此时index=2时,程序应该从前往后去遍历,尽量减少遍历的次数。那么在if判断里面应该为index <= (size >> 1) 不知道这个是不是LinkedList的待优化的地方,但是至少这个地方我觉得是应该加等于号的。可能是我自己理解的问题,如有错误,欢迎大家指正,O(∩_∩)O谢谢!!!

时间: 2024-08-25 04:06:08

关于JDK1.7中LinkedList索引方法的思考的相关文章

关于CSS中隐藏内容方法的思考

正在读<精通CSS>,很多样式需要用到内容隐藏,比如平时无内容,鼠标悬停时显示出内容.书中常用的方法是用text-indent:-1000em.margin-left:-1000em将元素隐藏到屏幕边缘之外,而display:none和visibility:hidden.overflow:hidden也可以做到隐藏,那么这几种用法有哪些利弊呢? 1.display:none; 搜索引擎可能认为被隐藏的元素属于垃圾信息而忽略,不利于SEO:屏幕阅读器会忽略被隐藏的元素. 2.visibility

JDK1.7中调用javascript方法

import java.io.File; import javax.script.Invocable; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; public class TestJs { public static void main(String[] args) throws Exception { Script

Java并发编程总结4——ConcurrentHashMap在jdk1.8中的改进

一.简单回顾ConcurrentHashMap在jdk1.7中的设计 先简单看下ConcurrentHashMap类在jdk1.7中的设计,其基本结构如图所示: 每一个segment都是一个HashEntry<K,V>[] table, table中的每一个元素本质上都是一个HashEntry的单向队列.比如table[3]为首节点,table[3]->next为节点1,之后为节点2,依次类推. public class ConcurrentHashMap<K, V> ext

Java并发编程总结4——ConcurrentHashMap在jdk1.8中的改进(转)

一.简单回顾ConcurrentHashMap在jdk1.7中的设计 先简单看下ConcurrentHashMap类在jdk1.7中的设计,其基本结构如图所示: 每一个segment都是一个HashEntry<K,V>[] table, table中的每一个元素本质上都是一个HashEntry的单向队列.比如table[3]为首节点,table[3]->next为节点1,之后为节点2,依次类推. public class ConcurrentHashMap<K, V> ext

String中的equals方法解析 jdk1.7

注  此篇为jdk1.7中的源码解析 equals()方法中的判断分一下步骤 1先判断内存地址是否相同  如果内存地址相同 那么字符串就是相同的 返回true 2 判断当前字符串和参数字是否属于同一类    如果不相等 返回false 3比较字符串长度(也就是char[]数组)是否相等  不相等返回false 4 逐个字符比较 如果不相等 返回false 下面贴上源码 public boolean equals(Object anObject) { if (this == anObject) {

【1】Jdk1.8中的HashMap实现原理

HashMap概述 HashMap是基于哈希表的Map接口的非同步实现.此实现提供所有可选的映射操作,并允许使用null值和null键.此类不保证映射的顺序,特别是它不保证该顺序恒久不变. 内部实现 HashMap的数据结构(字段) 在Java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,HashMap也不例外.HashMap实际上是一个"链表散列"的数据结构,即数组和链表的结构,但是在jdk1.8里 加入了红黑

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

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

Jdk1.8中的HashMap实现原理

本文主要参考:美团点评技术团队 HashMap概述 HashMap是基于哈希表的Map接口的非同步实现.此实现提供所有可选的映射操作,并允许使用null值和null键.此类不保证映射的顺序,特别是它不保证该顺序恒久不变. HashMap的数据结构 在Java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,HashMap也不例外.HashMap实际上是一个"链表散列"的数据结构,即数组和链表的结构,但是在jdk1.8

Java JDK1.7的LinkedList

Java JDK1.7的LinkedList @author ixenos LinkedList LinkedList是List接口的双向链表实现,JDK1.7以前是双向循环链表,以后是双向非循环链表: 由于是链表结构,所以长度没有限制:而且添加/删除元素的时候,只需要改变指针的指向(把链表断开,插入/删除元素,再把链表连起来)即可,非常方便,而ArrayList却需要重整数组 (add/remove中间元素).所以LinkedList适合用于添加/删除操作频繁的情况 JDK1.7以前 双向循环