zoukankan      html  css  js  c++  java
  • 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 差。

  • 相关阅读:
    Spring Boot2 系列教程(二十)Spring Boot 整合JdbcTemplate 多数据源
    Spring Boot 如何给微信公众号返回消息
    Spring Boot2 系列教程(十九)Spring Boot 整合 JdbcTemplate
    Spring Boot2 系列教程(十八)Spring Boot 中自定义 SpringMVC 配置
    Spring Boot 开发微信公众号后台
    Spring Boot2 系列教程(十七)SpringBoot 整合 Swagger2
    Spring Boot2 系列教程(十六)定时任务的两种实现方式
    Spring Boot2 系列教程(十五)定义系统启动任务的两种方式
    Spring Boot2 系列教程(十四)CORS 解决跨域问题
    JavaScript二维数组
  • 原文地址:https://www.cnblogs.com/ming-blogs/p/10891601.html
Copyright © 2011-2022 走看看