`
java_fei
  • 浏览: 21680 次
  • 性别: 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 1.6中,ArrayList提供了线程不安全的高效操作,适合于非并发环境下的高性能读写操作。其优点在于随机访问快速,因为数组支持索引直接访问;缺点是插入和删除元素需要移动后续元素,效率较低。 Vector与...

    ArrayList Vector LinkedList 区别与用法.

    ### ArrayList、Vector、LinkedList 的区别与用法详解 在Java编程中,选择合适的数据结构对于程序的性能至关重要。本文将深入探讨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面试笔记.pdf

    - 在JDK 1.6中,无参构造函数会创建一个初始容量为10的数组。 - 在JDK 1.7及以后,无参构造的ArrayList的初始容量为0,实际容量会在添加元素时分配。 - JDK 1.8中扩容是通过调用Arrays.copyOf和System.arraycopy方法...

    本仓库记录了我的Java学习进阶之路,涵盖了Java基础、JDK源码、JVM中的重要知识,附有代码和博客讲解,旨在提供一个Java在线共享学习平台,帮助更多的Java学习入门者进阶 .zip

    作者目录Java基础Java基础学习(1)——引用Java基础学习(2)——注解Java基础学习(3)——泛型Java基础学习(4)——动态代理《Java多线程核心技术》读书笔记JDK源Java集合框架源码解读(1)——ArrayList、LinkedList和...

    JDK1.1-Documentation(EN)

    2. **集合框架**:虽然 JDK 1.2 才完整引入了集合框架,但 JDK 1.1 已经引入了 `Vector` 和 `Stack` 类,它们是后来的 `ArrayList` 和 `LinkedList` 的前身,为存储和操作对象数组提供了便利。 3. **接口**:JDK ...

    Java集合框架面试题

    - a) Vector 和 ArrayList 都是实现了基于动态数组的数据结构,如果集合中元素的个数大于目前集合数组的长度时,Vector 增长率为目前数组长度的 100%,ArrayList 则为目前数组长度的 50%,如果集合中使用数据量比较...

    java源码收集-depthgoods::restroom::restroom:面试题收集Java并发专题JDK源码JVM等:restroom::restroom:

    2. **并发容器**:Java提供了多种并发容器,如ArrayList, Vector, LinkedList, ConcurrentHashMap等,它们在并发环境下有着不同的性能表现和适用场景。 3. **并发工具类**:如CountDownLatch, CyclicBarrier, ...

    JDK8集合基础.pdf

    ### JDK8集合基础知识点 #### 一、集合体系图(熟记) - **集合体系**:在Java中,集合框架主要包括两大接口:`Collection`和`Map`。 - `Collection`接口:处理一组对象,进一步分为`List`和`Set`。 - `List`...

    Java集合常见面试题总结(上)-JavaGuide面经思维导图总结

    - JDK 1.6之前使用循环链表,JDK 1.7取消循环。 ##### 2. `Set` - **HashSet** - 基于`HashMap`实现,使用`HashMap`存储元素。 - 特点:插入、删除和查找速度非常快,但不保证元素的顺序。 - **LinkedHashSet**...

    ArrayList的实现原理

    ArrayList是Java集合框架中常用的动态数组,它是List接口的一个实现,允许存储包括null在内的所有元素。ArrayList的主要特点是通过...根据实际需求,可以选择ArrayList或其他更合适的数据结构,如LinkedList或Vector。

    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版本,运行效率快、线

    10个Java经典的List面试题!.pdf

    - Java中常见的List实现类有ArrayList、LinkedList和Vector。ArrayList基于动态数组实现,适合随机访问;LinkedList是双链表结构,适用于频繁插入和删除操作;而Vector与ArrayList类似,但它是线程安全的。 2. **...

    马士兵J2SE第七章容器个人学习笔记.pdf

    - 线程安全性:两者都不是线程安全的,但在JDK 1.0中,`Vector`(`ArrayList`的前身)是线程安全的,性能相对较差。 【HashMap与HashTable的区别】 1. 线程安全:`HashMap`是非线程安全的,`HashTable`是线程安全的...

    Java JDK 6学习笔记_pdf版(附课本代码)

    5. **集合框架**:涵盖ArrayList、LinkedList、Vector、HashMap、HashSet、TreeMap和TreeSet等集合类的使用,以及集合接口(List、Set、Map)的实现和操作。 6. **I/O流**:解释输入输出流的概念,包括字节流和字符...

    Java集合容器面试题(2024最新版)-重点.docx

    10. **ArrayList与LinkedList、Vector的区别**: - ArrayList在随机访问时效率高,插入和删除元素时效率低。 - LinkedList在插入和删除元素时效率高,但随机访问效率低。 - Vector与ArrayList类似,但它是线程...

    java基础核心总结归纳---参考手册--心得手册-学习资料-总结经验

    - 集合框架:如ArrayList、Vector、LinkedList、HashSet、TreeSet、LinkedHashSet、HashMap等,用于存储和操作对象。 - 泛型:提供类型安全,允许在类、接口和方法中指定参数类型。 - 反射:运行时动态获取类的...

    JAVA Vector源码解析和示例代码

    总的来说,`Vector`在早期的Java开发中广泛使用,但在现代Java编程中,由于性能原因,它已经逐渐被`ArrayList`和`LinkedList`等其他集合类所取代。然而,了解`Vector`的工作原理和使用方法仍然有助于理解Java集合...

Global site tag (gtag.js) - Google Analytics