Java集合List实现原理

参考:https://www.cnblogs.com/kanglijun/p/10999247.html

一、集合类结构

Java中的集合包含多种数据结构,如链表、队列、哈希表等。从类的继承结构来说,可以分为两大类,一类是继承自Collection接口,这类集合包含List、Set和Queue等集合类。另一类是继承自Map接口,这主要包含了哈希表相关的集合类。

1.继承Collection接口
Collection
2.继承Map接口
Map
二、实现原理
1.List (有序,可重复)

常用的实现List接口的主要有ArrayList、Vector、LinkedList 三个

(1)ArrayList

实现原理:
ArrayList底层实现采用的数据结构是数组,并且数组默认大小为10,所以下面两种方式是等同的:

List list = new ArrayList();  //没有指定数组大小,使用默认值(默认大小是10)

List list = new ArrayList(10);  // 指定数组大小为10,传如的参数便是数组的大小,传入为10时,跟默认值相同,所以是等同的

注:不同的jdk版本实现代码有所不同, 现以jdk1.8为例(个人感觉
jdk1.6的底层实现写法更好理解,jdk1.8就比1.6较难懂一些)

// 无参构造器
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;   // DEFAULTCAPACITY_EMPTY_ELEMENTDATA是一个默认大小的空实例
}

// 有参构造器,参数为列表的初始容量(由于是通过数组实现的,所以可以理解成数组的大小)
public ArrayList(int initialCapacity) {
  if (initialCapacity > 0) {
    this.elementData = new Object[initialCapacity];
  } else if (initialCapacity == 0) {
    this.elementData = EMPTY_ELEMENTDATA;
  } else {
    throw new IllegalArgumentException("Illegal Capacity: "+initialCapacity);
  }
}

扩容机制:
jdk1.8的扩容算法:

newCapacity = oldCapacity + ( oldCapacity >> 1 ) ;   // oldCapacity >> 2` 

移位运算,此处相当于oldCapacity除以2,但是 >> 这种写法更加高效

jdk1.6的扩容算法:

newCapacity = ( oldCapacity * 3 ) / 2 +1 ;

参数介绍:newCapacity 是扩容后的容量大小,oldCapacity 是扩容前的大小
(2)Vector

Vector的底层也是通过数组实现的,默认大小也是10。主要特点:查询快,增删慢 , 线程安全,但是效率低

实现原理:

创建对象与ArrayList类似,但有一点不同,它可以设置扩容是容量增长大小。

根据Vector的三个构造器就可以很明了的理解 new Vector(); 与 new Vector(10);与 new Vector(10,0); 三个是等同的,很明了就不赘述了。

1.无参构造器
 public Vector() {
        this(10);
    }

2.传一个参数(容量大小) 容量大小即底层数组大小
public Vector(int initialCapacity) {
        this(initialCapacity, 0);
    }

3.传两个参数(容量大小,容量修正) 容量修正即扩容时的增加量
public Vector(int initialCapacity, int capacityIncrement) {
        super();
        if (initialCapacity < 0)
            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
        this.elementData = new Object[initialCapacity];
        this.capacityIncrement = capacityIncrement;
    }

(3)LinkedList

LinkedList底层是一个双向链表,它增删快,效率高,但是查询慢,线程不安全

实现原理:
构造器只有如下两种;

1.无参构造
public LinkedList() {
    }

2.有参构造
public LinkedList(Collection<? extends E> c) {
        this();
        addAll(c);
    }

由于它的底层实现是链表,所以没有容量大小的定义,只有上个节点,当前节点,下个节点,每个节点都有一个上级节点和一个下级节点。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值