Java基础 - 集合


      集合包括常用的ArrayList、HashMap、HashSet,也有不常用的Stack、Queue,有线程安全的Vector、HashTable,也有线程不安全的LinkedList、TreeMap等。

  • Arraylist                                                         

  ArrayList是实现List接口的动态数组,初始容量10,即数组大小。在每次向容器中增加元素的同时都会进行容量检查,当快溢出时,就会进行扩容操作(数据向新数组的重新拷贝)。不是同步的,多线程中使用,最好在创建的时候保证同步。

  例如  :

 List list = Collections.synchronizedList(new ArrayList()); 

  新建:即创建一个transient修饰的数组。

  新增:

    方法:add(E e)、add(int index, E element)、addAll(Collection<? extends E> c)、addAll(int index, Collection<? extends E> c)、set(int index, E element)

    通常会先一步检测容器大小,查看是否需要扩容。调用ensureCapacity()方法对ArrayList集合进行扩容操作

public void ensureCapacity(int minCapacity) {
        //修改计时器
        modCount++;
        //ArrayList容量大小
        int oldCapacity = elementData.length;
        /*
         * 若当前需要的长度大于当前数组的长度时,进行扩容操作
         */
        if (minCapacity > oldCapacity) {
            Object oldData[] = elementData;
            //计算新的容量大小,为当前容量的1.5倍
            int newCapacity = (oldCapacity * 3) / 2 + 1;
            if (newCapacity < minCapacity)
                newCapacity = minCapacity;
            //数组拷贝,生成新的数组
            elementData = Arrays.copyOf(elementData, newCapacity);
        }
    }

    若为指定index位置插入元素add(int index, E element),会调用System.arraycopy()方法,目的就是将index位置空出来以供新数据插入,这里需要进行数组数据的右移,这是非常麻烦和耗时的,所以如果指定的数据集合需要进行大量插入操作,推荐使用LinkedList。

  删除:

    方法:remove(int index)、remove(Object o)、removeRange(int fromIndex, int toIndex)、removeAll()

    删除元素后,会调用System.arraycopy(...)方法对剩余元素位置进行调整

  获取:

    方法:get(int index)

    由于ArrayList是动态数组,所以我们完全可以根据下标来获取ArrayList中的元素,而且速度还比较快,故ArrayList适于随机访问

  • LinkedList

  LinkedList是实现List接口的链表,插入和删除时优于ArrayList,而随机访问则比ArrayList逊色些。

 



 

posted @ 2017-03-31 01:55  hws2017  阅读(305)  评论(0编辑  收藏  举报