码迷,mamicode.com
首页 > 编程语言 > 详细

Java集合之Vector源码分析

时间:2019-01-02 21:12:02      阅读:153      评论:0      收藏:0      [点我收藏+]

标签:这一   图片   指定   返回   apt   关注   设置   锁对象   api   

概述

Vector与ArrayLIst类似, 内部同样维护一个数组, Vector是线程安全的. 方法与ArrayList大体一致, 只是加上 synchronized 关键字, 保证线程安全, 下面就不具体分析源码了, 具体可以查看ArrayList中的源码分析.

Vector源码分析

1.主要字段

技术分享图片

 

2.构造函数

技术分享图片

 

技术分享图片

 

3.增删改查

技术分享图片

 

其他方法大部分类似, 不再赘述, 下面看下扩容机制的函数:

技术分享图片

 

技术分享图片

 

Vector与ArrayList的区别

  1. Vector是线程安全的, ArrayList不是线程安全的, 这是最主要的
  2. ArrayList不可以设置扩展的容量, 默认1.5倍; Vector可以设置, 默认2倍
  3. ArrayList无参构造函数中初始量为0; Vector的无参构造函数初始容量为10

Vector与Collections.synchronizedList

Vector是java.util包中的一个类。 SynchronizedList是java.util.Collections中的一个静态内部类。

在多线程的场景中可以直接使用Vector类,也可以使用Collections.synchronizedList(List list)方法来返回一个线程安全的List。

那么,到底SynchronizedList和Vector有没有区别,为什么java api要提供这两种线程安全的List的实现方式呢?

以下看 synchronizedList 部分源码:

技术分享图片

 

技术分享图片

 

技术分享图片

 

技术分享图片

 

技术分享图片

 

从代码中, 我们可以看出:

  1. Vector使用同步方法实现, synchronizedList使用同步代码块实现
  2. 两者的扩容数组容量方式不一样(两者在扩容方面的差别就是ArrayList和Vector的差别)

但是, SynchronizedList中 listlterator方法并没有做同步处理, 但是在Vector却对该方法加了方法锁. 所以, 在使用SynchronizedList进行遍历的时候要手动加锁.

技术分享图片

 

但是之后的但是, 如果想要把LinkedList变成线程安全的, 那么我们可以将已有的LinkedList直接转成SynchronizedList, 而不用改变它的底层数据结构, 这一点是Vector无法做到的, 因为Vector底层结构是使用数组的, 这一点是无法更改的.

总结两者区别如下:

  1. SynchronizedList有很好的扩展和兼容功能, 可以将所有的List子类转成线程安全的类
  2. 使用SynchronizedList在遍历的时候要手动进行同步处理
  3. SynchronizedList可以指定锁对象

 

 

可以关注一下鄙人的公众号, 谢谢各位了!技术分享图片

Java集合之Vector源码分析

标签:这一   图片   指定   返回   apt   关注   设置   锁对象   api   

原文地址:https://www.cnblogs.com/hujingnb/p/10181577.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!