`
java_fei
  • 浏览: 21167 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

jdk1.6源码学习---ArrayList,LinkedList,vector

阅读更多

ArrayList类:该类继承list,该类中是单向链表,里面存在一个object[]数组,elementData[],在调用get方法是对数组进行获取elementData[index]的方法,所以使用ArrayList来读取数据,它的效率是非常高的,但是它在add(E)和add(int E)的时候却需要对数组进行扩展,使用System.arraycopy进行数组扩展。

ArrayList特点 写道
所以在进行多条数据进行添加的时候效率会比较低。并且注意了:ArrayList是并非线程安全的
 
    public E get(int index) {
    RangeCheck(index);//验证索引是否超过数组长度
    return (E) elementData[index];
    }
    //add(E)方法
    public boolean add(E e) {
    ensureCapacity(size + 1);  // 验证数组是否需要扩容
    elementData[size++] = e;
    return true;
    }
    //add(int E)方法
    public void add(int index, E element) {
    if (index > size || index < 0)
        throw new IndexOutOfBoundsException(
        "Index: "+index+", Size: "+size);

    ensureCapacity(size+1);  // 验证数组是否需要扩容
    System.arraycopy(elementData, index, elementData, index + 1,
             size - index);
    elementData[index] = element;
    size++;
    }
 


LinkedList类:该类可能很多人都知道它是双链表,那么它究竟是怎么实现的呢?在LinkedList.java文件中有另外一个class Entry<E>该类有三个元素:当前元素,上一级元素,下一级元素

    Entry(E element, Entry<E> next, Entry<E> previous) {
        this.element = element;
        this.next = next;
        this.previous = previous;
    }
 


所以在构建整个LinkedList的时候只要一个头head即可构建双链表。即a<->b<->c,由于这种模型的特殊性,所以对LinkedList进行插入的时候只需要改变previous和next的执行就可以了,而无需进行数组的扩容,所以对于LinkedList而言它进行多数据插入和删除的时候具有及高的效率。但是对于查询而言,它则需要进行for循环进行遍历。

LinkedList特点 写道
所以LinkedList适合那种多插入删除少修改查询的数据存储。当然它也是线程非安全的
 
    public boolean add(E e) {
    addBefore(e, header);
        return true;
    }
    调用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;
    }
 


从上面可以看出来添加是改变Entry的指针不需要数组扩容看,所以非常方便(删除也一样),但是使用get方法:

   public E get(int index) {
        return entry(index).element;
    }
    //调用entry方法
    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)) {//这里是一个小技巧,右移1位,相当于使用了二分法
            for (int i = 0; i <= index; i++)
                e = e.next;
        } else {
            for (int i = size; i > index; i--)
                e = e.previous;
        }
        return e;
    }
 

可见在LinkedList中获取一个数据是非常麻烦的事情需要进行for循环。
Vector类:该类和ArrayList的区别与hashtable和hashmap的区别一样,它其实实现了ArrayList的线程同步问题。具体代码基本一样。读者可以自己仔细去看看

分享到:
评论

相关推荐

    JDK1.6中Arraylist,Vector,LinkedList源码

    这是我从JDK中拿出的Arraylist,Vector,LinkedList源码,自己看源码的时候弄出来的,并写了一点自己的分析,仅供源码分析者使用

    java8源码-csn-list:ArrayList、LinkedList、Vector、Stack源码分析

    List相关实现类的源码解析(JDK1.8) 2018.9.22- List的架构图 ArrayList 继承关系: ArrayList -&gt; AbstractList 实现 List接口 ArrayList 是一个数组队列,相当于 动态数组。与Java中的数组相比,它的容量能动态...

    java1.8源码-jdk1.8.0_151-:阅读Java源码,版本为jdk1.8.0_151,将会同步翻译源码中的文档注释

    jdk1.8.0_151-源码的中文翻译和一些自己的理解 声明 作者现在大四快要毕业,在实习中,为了在未来成为一名架构师,下定决心开始读Java的源代码;读源码的过程非常难熬,我在以前也曾读过源码,但都坚持的不久,也...

    Java基础–为什么ArrayList,Vector等都不支持循环中remove?

    为什么ArrayList,Vector等都不支持循环中remove1 ...其实,在Vector,ArrayList,LinkedList中,删除有两种方式进行删除: 1.循环中删除 2.直接删除 1 Vector 直接删除 直接删除首先调用indexOf方法,得到目标元素

    List实现类中的ArrayList、Vector、LinkedList

    首先,List接口继承于Collection接口,其中的所有方法都被继承,而Collection是无序、无下标,元素不可重复的,List是有序,有下标,元素可以重复,所以,List就有一些自己独有的方法。...JDK1.2版本,运行效率快、线

    清华妹子的Java仓库(进阶学习路线)

    Java集合框架源码解读(1)——ArrayList、LinkedList和Vector Java集合框架源码解读(2)——HashMap Java集合框架源码解读(3)——LinkedHashMap Java集合框架源码解读(4)——WeakHashMap Java集合框架源码解读

    Java集合框架常见面试题.pdf

    剖析⾯试最常⻅问题之 Java 集合框架 集合概述 Java 集合概览 从下图可以看出,在 Java 中除了以 ...LinkedList : 双向链表(JDK1.6 之前为循环链表,JDK1.7 取消了循环) Set HashSet (⽆序,唯⼀): 基于 HashMap 实

    java8源码-JavaRobot:Java学习笔记,JavaLearningNote

    学习笔记(持续更新中) 所有文章均同步发布到微信公众号【JavaRobot】,关注微信公众号,及时得到文章推送,谢谢支持。 说明:如无特别说明,所有代码都基于JDK8 JavaSE(Java基础) Java Core 关键字 synchronized...

    java8源码-JDKSourceCode:阅读jdk1.8的一些注意事项

    Vector different with ArrayList 2018/3/26 ChangeLogs LinkedList ctor-2 addFirst addLast addAll add indexOf lastIndexOf peek 获取第一个元素,是 null 就返回 null peekFirst/Last 获取第一个最后一个元素 ...

    【JDK1.8源码剖析】Collection接口

    文章目录Collection源码剖析(一)简介(二)源码分析 Collection源码剖析 (一)简介 Collection接口是集合层次结构中的根接口。 (1)下面是常用集合类关系图 Collection  |___List 有序,可重复  |___...

    JAVA容器(每天学习一点点20191223)

    LinkedList: 双向链表(JDK1.6之前为循环链表,JDK1.7取消了循环) List,Set,Map三者的区别 List(对付顺序的好帮手): List接口存储一组不唯一(可以有多个元素引用相同的对象),有序的对象 Set(注重独一无二的...

    JDKAPI18CN(中文版)

    (这个类是大致相当于Vector,不同之处在于它是不同步的)。 该size,isEmpty,get,set,iterator和listIterator操作在固定时间内运行。 add操作以摊余常数运行 ,即添加n个元素需要O(n)个时间。 所有其他操作...

    Java容器详解

    1.什么是容器在Java当中,有一个类专门用来存放其它类的...Arraylist:Object数组Vector:Object数组LinkedList:双向链表(JDK1.6之前为循环链表,JDK1.7取消了循环)2.Set一个不包含重复元素的collection。更确切地讲,

    Java 基础核心总结 +经典算法大全.rar

    ArrayList Vector LinkedList 类Stack HashSet TreeSet LinkedHashSet 类 PriorityQueue HashMap TreeMap 类 LinkedHashMap 类 Hashtable 类IdentityHashMap 类WeakHashMap 类 Collections 类集合实现类特征图 泛形 ...

    Java集合教程吐血整理干货.md

    ArrayList的特点 Vector的特点 LinkedList的特点 Set ConcurrentModificationException异常 线程安全的集合 线程安全的 List CopyOnWriteArrayList 线程安全的Set 线程安全的Map ConcurrentHashMap ...

    DataStructureJava:主要数据结构——java中的简单实现

    数据结构Java 主要数据结构——java中的简单实现如何使用集合:-&gt; JDK(Java集合)-&gt; Guava(谷歌)-&gt; Commons-collections(Apache) 主要抽象数据结构——ADS列表(ArrayList、LinkedList、Vector)栈(FIFO)队列...

    javalruleetcode-dsal:数据结构与算法个人整理

    集合源码 基本 List, Set, Queue, Map ArrayList, LinkedList, Vector, CopyOnWriteArrayList HashMap JDK7, JDK8 ConcurrentHashMap JDK7, JDK8 HashTable, ThreadLocalMap, WeakHashMap Leetcode 刷题记录 栈实现...

    Java JDK实例宝典

    Vector和LinkedList 4. 6 生成不重复的随机数序列 4. 7 自定义队列 4. 8 对List排序 4. 9 HashSet. LinkedHashSet和TreeSet 4. 10 列表. 集合与数组的互相转换 4. 11 HashMap. Hashtable. ...

    java面试笔试资料包括JAVA基础核心知识点深度学习Spring面试题等资料合集.zip

    第四题 ArrayList LinkedList Vector的区别.pdf docker讲得最清楚.doc Dubbo是什么?能做什么?.doc java 基于TCP协议的Socket编程和通信.doc Java面试高级篇—说说TCP,UDP和socket,Http之间联系和区别.doc MySQL...

    JAVA SE 开发手册.CHM

    14、JAVA集合框架之list接口、LinkedList类、ArrayList类、Vector类 15、JAVA集合框架之Set接口、HashSet类、TreeSet类 16、JAVA集合框架之Map接口、HashMap类、Trelap类、Hashtable类 17、JAVA异常Exception 18...

Global site tag (gtag.js) - Google Analytics