从零开始读Java源码--Collections篇

本文深入探讨Java集合框架,重点讲解Collection接口、List接口及其四种核心实现类:ArrayList、LinkedList、Vector和Stack的特点与应用场景。对比不同集合在性能、线程安全及数据结构上的差异,帮助读者理解并合理选择集合类。
摘要由CSDN通过智能技术生成

最近看了一篇讲程序员的知识架构的博文,那些知识有种熟悉但是具体也说不上个所以然的感觉,尤其是涉及到并发开发的这些Java包,但是上路永远不晚,我的老伙计。

目前主要是源码笔记加上一丢丢个人理解。

一 Collection接口

java.util 包下的接口,超顶层级别接口,同其他接口一样无任何实现方法,所有集合类型的数据结构的必经之路。

那么先从List搞起来,可以这么说List从Collection接口进一步勾勒出了有序集合的模样,仍是接口方式存在。它可以控制每个元素的插入位置和通过整数索引来访问元素。与Set不同的是允许重复元素,且允许插入多个null值。对于不同的List实现类,我们主要关注以下四个实现类。

List<Object> al = new ArrayList<>();
List<Object> ll = new LinkedList<>();
List<Object> v = new Vector<>();
List<Object> s = new Stack<>();

ArrayList,继承了AbstractList,作为List接口的可变长的数组实现,实现了list的所有操作,允许所有类型包括null,相对list,增加了维护调整存储数组大小的方法,近似等于Vector除了它没同步,也就是线程不安全。

它给出了可以规定初始数组大小的构造方法

public ArrayList(int initialCapacity) 

size,isEmpty,get,set,iterator,listIterator方法为常量复杂度。其他的方法为线性时间复杂度。

add为分摊常量时间,原文解释为加入n个元素就是O(n)时间。当小于给定的初始大小的时候,add的效率较高,但是当超出范围时,内存中发生扩容,并复制数组,会浪费时间,这一点上不如Linkedlist

在jdk1.7以后中,ArrayList默认初始容量为10,扩容时为原容量的1.5倍,int newCapacity = oldCapacity + (oldCapacity >> 1);

当知道要add大量元素的时候,建议使用ensureCapacity操作,汗颜暂时没用过。

注意这个数据结构未进行同步,如果有多线程并发访问,并有线程进行数据结构上更改时(仅仅修改元素值不算更改数据结构),这通常是通过一些其他类封装实现的。

如果没有这样的类,建议提前使用List list = Collections.synchronizedList(new ArrayList(...));进行装饰,就是通过装饰器增强了类功能。

fail-fast机制,此机制存在于这四个类,所以不重复叙述

个人理解就是你在通过迭代器进行操作时,不能改变原来的数据结构,例如foreach里进行add,remove,否则就立刻给你抛出java.util.ConcurrentModificationException异常,而避免并发中带来的不确定性。

Vector,

空参默认初始容量为10,容量自增为0,可以指定容量自增大小,Vector的容量可以增大也可以减小

扩容时int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
                                 capacityIncrement : oldCapacity);

值得注意的是,其涉及到并发的方法均使用synchronized进行修饰,因此建议在不涉及到并发时使用ArrayList进行代替。

Linkedlist,继承了AbstractSequentialList<E>

既实现了List也实现了Deque,可以作为双端队列使用,允许null值。可以从头部访问也可以从尾部访问。

线程不安全,这一点和ArrayList一样。

Stack继承了Vector,作为一种后进先出的数据结构实现,它实现了五个方法来使得Vector具有栈的特性,

push,pop,peek,empty,search(查看距离栈顶多远)

Deque接口及其实现提供了更完整和一致的LIFO堆栈操作集,这些接口应优先于此类。 例如:

Deque<Integer> stack = new ArrayDeque<Integer>();

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值