`

List集合源码简单分析

    博客分类:
  • java
阅读更多

1.ArrayList

数据结构:数组,默认长度为10;
     /**
     * Shared empty array instance used for empty instances.
     */
    private static final Object[] EMPTY_ELEMENTDATA = {};
    /**
     * Constructs an empty list with an initial capacity of ten.
     */
    public ArrayList() {
        super();
        this.elementData = EMPTY_ELEMENTDATA;
    }
以*2的方式增长list长度,长度最长为Integer.MAX_VALUE - 8
 /**
     * Increases the capacity to ensure that it can hold at least the
     * number of elements specified by the minimum capacity argument.
     *
     * @param minCapacity the desired minimum capacity
     */
    private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        // minCapacity is usually close to size, so this is a win:
        elementData = Arrays.copyOf(elementData, newCapacity);
    }

get(i)/set(i,e)/add(e)操作性能很高,这是数组的基本优势

 

  /**
     * Returns the element at the specified position in this list.
     *
     * @param  index index of the element to return
     * @return the element at the specified position in this list
     * @throws IndexOutOfBoundsException {@inheritDoc}
     */
    public E get(int index) {
        rangeCheck(index);

        return elementData(index);
    }
add(i,e), remove(i), remove(e)需要使用System.arraycopy()来移动数据,性能相对较差

 

 

    /**
     * Inserts the specified element at the specified position in this
     * list. Shifts the element currently at that position (if any) and
     * any subsequent elements to the right (adds one to their indices).
     *
     * @param index index at which the specified element is to be inserted
     * @param element element to be inserted
     * @throws IndexOutOfBoundsException {@inheritDoc}
     */
    public void add(int index, E element) {
        rangeCheckForAdd(index);

        ensureCapacityInternal(size + 1);  // Increments modCount!!
        System.arraycopy(elementData, index, elementData, index + 1,size - index);
        elementData[index] = element;
        size++;
    }

 

2.LinkedList

数据结构:双向链表
    private static class Node<E> {
        E item;
        Node<E> next;
        Node<E> prev;

        Node(Node<E> prev, E element, Node<E> next) {
            this.item = element;
            this.next = next;
            this.prev = prev;
        }
    }

get(i)/set(i,e)操作,需要移动链表指针性能一般
 /**
     * Replaces the element at the specified position in this list with the
     * specified element.
     *
     * @param index index of the element to replace
     * @param element element to be stored at the specified position
     * @return the element previously at the specified position
     * @throws IndexOutOfBoundsException {@inheritDoc}
     */
    public E set(int index, E element) {
        checkElementIndex(index);
        Node<E> x = node(index);
        E oldVal = x.item;
        x.item = element;
        return oldVal;
    }
add(), addFirst(),removeLast()在链表两头的操作,无需移动指针,性能较好
 /**
     * Appends the specified element to the end of this list.
     *
     * <p>This method is equivalent to {@link #addLast}.
     *
     * @param e element to be appended to this list
     * @return {@code true} (as specified by {@link Collection#add})
     */
    public boolean add(E e) {
        linkLast(e);
        return true;
    }

3.CopyOnWriteArrayList

构造:数组,线程安全的ArrayList,采用副本拷贝的方式来操作集合,使用iterators迭代器时不支持set和remove操作,因为其在源集合操作
  /**
     * Creates a list holding a copy of the given array.
     *
     * @param toCopyIn the array (a copy of this array is used as the
     *        internal array)
     * @throws NullPointerException if the specified array is null
     */
    public CopyOnWriteArrayList(E[] toCopyIn) {
        setArray(Arrays.copyOf(toCopyIn, toCopyIn.length, Object[].class));
    }
get(i),set(i,e)都操作的拷贝副本,set(i,e)采用lock锁保证线程安全
/**
     * Replaces the element at the specified position in this list with the
     * specified element.
     *
     * @throws IndexOutOfBoundsException {@inheritDoc}
     */
    public E set(int index, E element) {
        final ReentrantLock lock = this.lock;
        lock.lock();
        try {
            Object[] elements = getArray();
            E oldValue = get(elements, index);

            if (oldValue != element) {
                int len = elements.length;
                Object[] newElements = Arrays.copyOf(elements, len);
                newElements[index] = element;
                setArray(newElements);
            } else {
                // Not quite a no-op; ensures volatile write semantics
                setArray(elements);
            }
            return oldValue;
        } finally {
            lock.unlock();
        }
    }

 

4.随机笔记

Eclipse快速查找类:ctrl+shift+t
 
 

5.后记

我的其他经常博客:http://blog.csdn.net/caicongyang
记录与分享,让你我共成长 from caicongyang
 

 

 





 

 

分享到:
评论

相关推荐

    集合框架源码分析

    在这个主题中,我们将深入分析集合框架的源码,理解其内部工作原理,以便更好地利用这些工具进行开发。 1. **接口与实现** Java集合框架主要包括`Collection`、`List`、`Set`和`Map`四大接口。`Collection`是最...

    【死磕Java集合】-集合源码分析.pdf

    Java集合框架源码分析 Java集合框架是Java语言中一个非常重要的组件,提供了多种数据结构和算法来存储和操作数据。在Java集合框架中,LinkedList、ArrayList、HashMap、TreeMap等都是非常常用的数据结构。本文将对...

    C#List字典Dictionary泛型集合实例,源码

    在.NET框架中,C#语言提供了丰富的数据结构和容器,其中最常用且强大的就是List、Dictionary和HashSet等泛型集合。这些集合类是基于泛型的,能够提供类型安全的数据存储,大大增强了代码的可读性和效率。接下来,...

    list遍历集合源码

    这些方法的实现都与List的具体实现有关,理解和分析源码能帮助我们优化代码性能和解决问题。 总的来说,深入学习List接口及其实现类的源码对于理解Java集合框架的工作原理至关重要。通过研究源码,我们可以更好地...

    易语言仿java集合 list map源码

    3. 集合类的实现:分析List类和Map类的内部结构,理解它们如何存储和操作数据。 4. 面向接口编程:虽然易语言没有像Java那样的接口概念,但可以通过模拟接口的实现,提供类似的功能。 5. 键值对操作:了解如何在Map...

    LitePal和GreenDao存储list集合源码

    本文将深入探讨两种流行的ORM(Object-Relational Mapping)框架——LitePal和GreenDao,它们可以帮助开发者简化数据库操作,特别是对于存储List集合数据的情况。 LitePal是一款轻量级的Android数据库框架,它基于...

    C#List泛型集合实例,源码

    创建`List&lt;T&gt;`实例非常简单,可以通过以下方式: ```csharp List&lt;int&gt; numbers = new List(); ``` 添加元素到`List&lt;T&gt;`中,可以使用`Add`方法: ```csharp numbers.Add(1); numbers.Add(2); numbers.Add(3); ``` ...

    Java集合类源码(摘自jr源码)

    在给定的压缩包文件中,包含了一些关键的集合类源码,如`TreeMap`、`Hashtable`、`ArrayList`、`HashMap`、`LinkedList`、`List`、`Map`、`TreeSet`、`LinkedHashMap`和`Set`。这些类都是Java集合框架的重要组成部分...

    Java集合源码全面分析

    在本文中,我们将全面分析Java集合框架的核心概念和实现细节。 首先,Java集合框架的基础是`Collection`接口,它是所有集合类的根接口,定义了集合的基本操作。`Collection`接口有两个重要的子接口:`List`和`Set`...

    Java源码分析:集合-容器.pdf

    单列集合中,Set接口的集合主要用于存储不重复的元素,而List接口的集合则可以存储重复的元素。双列集合则是指Map接口的集合,它存储的是键值对映射关系。 首先,Set集合是一个不允许重复元素的集合,它有多种实现...

    java字符串与集合互相转换,字符串转List,Map,List转String,String转List源码

    List集合转换成String,String转List,Map转String,String转Map等 集合与字符串相互转换,可以自己扩展源码,带有注释

    JAVA案例集合源码

    【JAVA案例集合源码】是一个综合性的资源,涵盖了Java编程语言的各种实际操作示例。这个压缩包中的源代码实例旨在帮助开发者深入理解Java的核心概念、语法特性以及在实际开发中的应用。下面,我们将详细探讨这些知识...

    Freemarker中遍历list集合实例

    Freemarker 中遍历 List 集合实例 Freemarker 中遍历 List 集合实例是指在 ...Freemarker 中遍历 List 集合实例相关源码及文件下载 如果您在阅读本文的过程中发现问题,请通过留言的形式给与批评指正,谢谢!

    常见的java集合源码分析,以及面试题

    首先,我们从基础开始,Java集合框架主要分为两大类:List(列表)和Set(集合)。List接口包括ArrayList、LinkedList和Vector等实现,它们保持元素的顺序,并允许重复元素。Set接口则包括HashSet、LinkedHashSet和...

    java集合类演示源码

    Java平台提供了一个全新的集合框架,框架的核心为Collection、List(列表)、Set(集合)和Map(映射)。集合类的框架为集合的实现者提供了大量的接口和抽象类,并对其中的某些机制给予了描述,例如,Iterator(迭代...

    对java基础集合部分(List、HashMap、HashSet、ArrayList等)底层源码的分析与总结

    Java集合框架是Java编程中非常重要的部分,它提供了一种高效、灵活的数据组织方式。本文主要探讨了几个关键...通过对源码的深入分析,我们可以更好地掌握Java集合框架的工作原理,并根据实际需求选择最适合的数据结构。

    hibernate list集合映射

    **标题:“Hibernate List集合映射”** 在Java的持久化框架Hibernate中,集合映射是将数据库中的表与Java对象的集合属性关联的过程。List集合映射是其中常见的一种方式,它允许我们将数据库中的一组相关记录映射到...

    C# DataTable 源码分析

    `List&lt;T&gt;`是泛型集合,提供了强类型的安全性和更好的性能,而`ArrayList`是.NET Framework早期版本的非泛型集合,兼容性较好但效率略低。 `MyList.cs`和`MyCollections.MyDataTable.csproj`可能是个人实现的列表类...

Global site tag (gtag.js) - Google Analytics