arraylist与vector的区别大家可以来看看

Hope0612 2010-10-19 09:04:03
就ArrayList与Vector主要从二方面来说.

一.同步性:Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步的

二.数据增长:当需要增长时,Vector默认增长为原来一培,而ArrayList却是原来的一半



就HashMap与HashTable主要从三方面来说。

一.历史原因:Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现

二.同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的

三.值:只有HashMap可以让你将空值作为一个表的条目的key或value



什么是线程安全?

如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。

  或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题。

举例

比如一个 ArrayList 类,在添加一个元素的时候,它可能会有两步来完成:1. 在 Items[Size] 的位置存放此元素;2. 增大 Size 的值。

  在单线程运行的情况下,如果 Size = 0,添加一个元素后,此元素在位置 0,而且 Size=1;

  而如果是在多线程情况下,比如有两个线程,线程 A 先将元素存放在位置 0。但是此时 CPU 调度线程A暂停,线程 B 得到运行的机会。线程B也向此 ArrayList 添加元素,因为此时 Size 仍然等于 0 (注意哦,我们假设的是添加一个元素是要两个步骤哦,而线程A仅仅完成了步骤1),所以线程B也将元素存放在位置0。然后线程A和线程B都继续运行,都增加 Size 的值。

  那好,现在我们来看看 ArrayList 的情况,元素实际上只有一个,存放在位置 0,而 Size 却等于 2。这就是“线程不安全”了。
...全文
507 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
wzju64676266 2010-10-21
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 eggno8 的回复:]
引用 20 楼 wzju64676266 的回复:

引用 18 楼 xiaoduan5267 的回复:

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

哎,颜色不好使啊


是的,不知道为什么这么多人说是一半,乱传

???这个int newCapacity = (oldCapacity * 3)/2 + 1;难道不表示新容量比就容……
[/Quote]

比如说oldCapacity=2;
那执行(oldCapacity * 3)/2 + 1;之后的值是多少呢,是4吧!那是原来的多少倍呢?


比如说oldCapacity=3;
那执行(oldCapacity * 3)/2 + 1;之后的值是多少呢,是5吧!那又是原来的多少倍呢?

是多少倍是不固定的,要根据oldCapacity 来的,怎么大多数人没有看源码都说是增加一半呢!包括N本书上都是这么写的,学校老师也有很多这么教的,包括很多面试官拿Vector ArrayList面试别人的时候,还指导别人说ArrayList增加的容量是一半
对程序误解是很正常的事,真是佩服如今的网络,很多错误的理念一直继承下来,传得满天飞

当然我没有贬低楼主的研究精神及分享精神,


come on!
hayuanjunbudilei 2010-10-21
  • 打赏
  • 举报
回复
感谢楼主分享,学习了。。。
wzju64676266 2010-10-21
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 eggno8 的回复:]
回26楼,我觉得设计者的意图任然是增加一半的意思。
第一,+1,保证肯定要增加,否则如果原来是1的时候就不会增加了,因为int截取是“去掉小数”形。因为“一半”本来就可能是个小数,这里的补1误差是为了防止这个。
第二,对常用情况来说,用到的数量级至少是10,100这种数量级吧。(oldCapacity * 3)/2 + 1,如果是100,增加后是151;如果是11,增加后是16;如果是2001……
[/Quote]

这个回答我同意,但不能一口认定是增加一半吧
eggno8 2010-10-21
  • 打赏
  • 举报
回复
回26楼,我觉得设计者的意图任然是增加一半的意思。
第一,+1,保证肯定要增加,否则如果原来是1的时候就不会增加了,因为int截取是“去掉小数”形。因为“一半”本来就可能是个小数,这里的补1误差是为了防止这个。
第二,对常用情况来说,用到的数量级至少是10,100这种数量级吧。(oldCapacity * 3)/2 + 1,如果是100,增加后是151;如果是11,增加后是16;如果是2001,增加后是3001,这样的数字让一个人回答,绝大多数人会回答“多了一半”。
所以,对这个(oldCapacity * 3)/2 + 1理解为增加一半我觉得很合理,而且我觉得设计者的意图本来也是这个意思,有误差,是因为确实有小数原因无法做到完美的“加一半”。记忆成“增加一半”,比记忆成“增加原有容量的一半int取整后加1”方便得多。
licip 2010-10-21
  • 打赏
  • 举报
回复
你说的很对。学习了。
liwutao 2010-10-21
  • 打赏
  • 举报
回复
借17楼的代码:
public void ensureCapacity(int minCapacity) {……}


请问一下大家minCapacity 这个指的是什么呢?
Miracle1216 2010-10-20
  • 打赏
  • 举报
回复
int newCapacity = (oldCapacity * 3)/2 + 1;

哎,颜色不好使啊
Miracle1216 2010-10-20
  • 打赏
  • 举报
回复
[Quote=引用楼主 hope0612 的回复:]
就ArrayList与Vector主要从二方面来说.

一.同步性:Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步的

二.数据增长:当需要增长时,Vector默认增长为原来一培,而ArrayList却是原来的一半



就HashMap与HashTable主要从三方面来说。

一.历史原因:Hashtable是基于陈旧的D……
[/Quote]

有个问题,ArrayList的增长好像不是原来的一般吧!源代码这样的:
public void ensureCapacity(int minCapacity) {
modCount++;
int oldCapacity = elementData.length;
if (minCapacity > oldCapacity) {
Object oldData[] = elementData;
int newCapacity = (oldCapacity * 3)/2 + 1; if (newCapacity < minCapacity)
newCapacity = minCapacity;
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
}
whut0802 2010-10-20
  • 打赏
  • 举报
回复
目前好多笔试面试用得着
yjflinchong 2010-10-20
  • 打赏
  • 举报
回复
不错。 面试经常问的一些
whut_lcy 2010-10-20
  • 打赏
  • 举报
回复
只要你的ArrayList或者Vector对象不会引起并发,所谓的线程安全与否都不重要了。
powerchuangwai 2010-10-20
  • 打赏
  • 举报
回复
这么说来vector好了
hanRivergo 2010-10-20
  • 打赏
  • 举报
回复
学习学习再学习。
24K純帥 2010-10-20
  • 打赏
  • 举报
回复
很像面试题~
renjianguokeivor 2010-10-20
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 hope0612 的回复:]
引用 19 楼 john_sheep 的回复:
最大的区别就是Vector现在“过时”了

是啊,前段时间,有人说了:如果你与时俱进,那么就用arrayList,如果你固步自封,就用Vector..
[/Quote]
长见识了
Hope0612 2010-10-20
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 john_sheep 的回复:]
最大的区别就是Vector现在“过时”了
[/Quote]
是啊,前段时间,有人说了:如果你与时俱进,那么就用arrayList,如果你固步自封,就用Vector..
tanpengpt 2010-10-20
  • 打赏
  • 举报
回复
安全问题!!!
eggno8 2010-10-20
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 wzju64676266 的回复:]

引用 18 楼 xiaoduan5267 的回复:

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

哎,颜色不好使啊


是的,不知道为什么这么多人说是一半,乱传
[/Quote]
???这个int newCapacity = (oldCapacity * 3)/2 + 1;难道不表示新容量比就容量增加1一半的意思么?
wzju64676266 2010-10-20
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 xiaoduan5267 的回复:]

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

哎,颜色不好使啊
[/Quote]

是的,不知道为什么这么多人说是一半,乱传
约翰羊 2010-10-20
  • 打赏
  • 举报
回复
最大的区别就是Vector现在“过时”了
加载更多回复(3)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧