• ArrayList与Vector区别


     

    集合框架介绍

     

     

     

    说明:对于以上的框架图有如下几点说明

     

    1.所有集合类都位于java.util包下。Java的集合类主要由两个接口派生而出:Collection和Map,Collection和Map是Java集合框架的根接口,这两个接口又包含了一些子接口或实现类。

    2. 集合接口:6个接口(短虚线表示),表示不同集合类型,是集合框架的基础。

    3. 抽象类:5个抽象类(长虚线表示),对集合接口的部分实现。可扩展为自定义集合类。

    4. 实现类:8个实现类(实线表示),对接口的具体实现。

    5. Collection 接口是一组允许重复的对象。

    6. Set 接口继承 Collection,集合元素不重复。

    7. List 接口继承 Collection,允许重复,维护元素插入顺序。

    8. Map接口是键-值对象,与Collection接口没有什么关系。

    9.Set、List和Map可以看做集合的三大类:

    List集合是有序集合,集合中的元素可以重复,访问集合中的元素可以根据元素的索引来访问。

    Set集合是无序集合,集合中的元素不可以重复,访问集合中的元素只能根据元素本身来访问(也是集合里元素不允许重复的原因)。

    Map集合中保存Key-value对形式的元素,访问时只能根据每项元素的key来访问其value。

    List集合介绍:

    List集合代表一个有序集合,集合中每个元素都有其对应的顺序索引。List集合允许使用重复元素,可以通过索引来访问指定位置的集合元素。

    List接口继承于Collection接口,它可以定义一个允许重复的有序集合。因为List中的元素是有序的,所以我们可以通过使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素,这类似于Java的数组。

    List接口为Collection直接接口。List所代表的是有序的Collection,即它用某种特定的插入顺序来维护元素顺序。用户可以对列表中每个元素的插入位置进行精确地控制,同时可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。实现List接口的集合主要有:ArrayList、LinkedList、Vector、Stack。

    ArrayList底层实现原理

    1. Arraylist底层基于数组实现
    2. private Object[] elementData;

    Arraylist底层默认数组初始化大小为10个object数组 

    1. public ExtArraylist() throws Exception {
      this(10);
      }

      public ExtArraylist( int initialCapacity) throws Exception {
      if (initialCapacity < 0) {
      throw new IllegalArgumentException("初始容量不能小于0 " + initialCapacity);
      }
      elementData = new Object[initialCapacity];
      }

    添加元素后大于当前数组的长度,则进行扩容,将数组的长度增加原来数组的一半。 

    1. // 增大数组空间
      private void grow ( int minCapacity){
      // overflow-conscious code
      int oldCapacity = elementData.length;
      int newCapacity = oldCapacity + (oldCapacity >> 1); // 在原来容量的基础上加上
      // oldCapacity/2
      if (newCapacity - minCapacity < 0)
      newCapacity = minCapacity; // 最少保证容量和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);

      }

    Vector底层实现原理

    Vector是线程安全的,但是性能比ArrayList要低。

    ArrayList,Vector主要区别为以下几点:

    1):Vector是线程安全的,源码中有很多的synchronized可以看出,而ArrayList不是。导致Vector效率无法和ArrayList相比;

    2):ArrayList和Vector都采用线性连续存储空间,当存储空间不足的时候,ArrayList默认增加为原来的50%,Vector默认增加为原来的一倍;

    3):Vector可以设置capacityIncrement,而ArrayList不可以,从字面理解就是capacity容量,Increment增加,容量增长的参数。

    private void grow ( int minCapacity){
    // overflow-conscious code
    int oldCapacity = elementData.length;
    int newCapacity = oldCapacity + (oldCapacity >> 1); //扩充的空间增加原来的50%(即是原来的1.5倍)
    if (newCapacity - minCapacity < 0) //如果容器扩容之后还是不够,那么干脆直接将minCapacity设为容器的大小
    newCapacity = minCapacity;
    if (newCapacity - MAX_ARRAY_SIZE > 0) //如果扩充的容器太大了的话,那么就执行hugeCapacity
    newCapacity = hugeCapacity(minCapacity);
    // minCapacity is usually close to size, so this is a win:
    elementData = Arrays.copyOf(elementData, newCapacity);
    }

    LinkeList原理

    LinkedList 和 ArrayList 一样,都实现了 List 接口,但其内部的数据结构有本质的不同。LinkedList 是基于链表实现的(通过名字也能区分开来),所以它的插入和删除操作比 ArrayList 更加高效。但也是由于其为基于链表的,所以随机访问的效率要比 ArrayList 差。

  • 相关阅读:
    JSON数据格式
    段寄存器
    进程 PCB 进程挂起
    python3:文件读写+with open as语句(转)
    Python 中 'unicodeescape' codec can't decode bytes in position XXX: trun错误解决方案
    intelx86为何从0xFFFF0处执行
    Linux内核调度分析(转,侵删)
    调度器简介,以及Linux的调度策略(转)
    nm命令
    Vim文本编辑器中常用的一些命令
  • 原文地址:https://www.cnblogs.com/ming-blogs/p/10891601.html
Copyright © 2020-2023  润新知