对比Vector、ArrayList、LinkedList有什么区别?

这三者都是实现集合框架中的List,也就是所谓的有序集合,因此具体功能也比较相似,比如都提供按照位置进行定位、添加或者删除的操作,都提供迭代器以遍历其内容等。但因为具体的设计区别、性能、线程安全等方面,表现大有不同。
Vector是java早期提供的线程安全的动态数组,如果不需要线程安全,不推荐使用,因为同步是有额外开销的。Vector内部使用对象数组来保存数据,可以根据需要自动的增加容量,当数组已满的时候,会创建新的数组,并拷贝原有数组数据。
ArrayList是应用更加广泛的动态数组实现,它本身不是线程安全的,所以性能要好的多。与Vector近似,ArrayList也是可以根据需要来调整容量,不过两者的调整逻辑有所区别,Vector在扩容时会提高一倍,而ArrayList则是50%。
LinkedList顾名思义时java提供的双向链表,所以不需要像上面两种那样调整容量,他也不是线程安全的。

Vector和ArrayList作为动态数组,其内部元素以数组形式顺序存储的,所以非常适合随机访问的场合。除了尾部插入和删除元素,往往性能相对会较差,比如中间插入一个元素,需要移动后续所有元素。
而LinkedList进行结点插入,删除要高效的多,但是随机访问性能则会比动态数组慢。

·List,提供了方便的访问,插入,删除等操作。
·Set,Set是不允许重复元素的,这是和List最明显的区别,也就是不存在两个对象equals返回true。
·Queue/Deque,则是java提供的标准队列结构的实现,除了集合的基本功能,他还支持类似先入先出,或者后入先出等特定行为。

每种集合的通用逻辑,都被抽象到相应的抽象类之中,比如AbstractList就集中了各种List操作的通用部分。这些集合不是完全孤立的,比如LinkedList本身,既是List,也是Deque。

·TreeSet支持自然顺序访问,但是添加、删除、包含等操作相对低效。
·HashSet则是利用哈希算法,理想情况下,如果哈希散列正常,可以提供常数时间的添加、删除、包含等操作,但是不保证有序。
·LinkedHashSet,内部构建了一个记录插入顺序的双向链表,因此提供了按照插入顺序遍历的能力,与此同时,也保证了常数时间的添加,删除,包含等操作,性能略低于HashSet,因为需要维护链表的开销。
·在遍历元素时,HashMap性能受自身容量影响,所以初始化时,除非有必要,不然不要将其背后的HashMap容量设置过大。而对于LinkedHashSet,由于其内部链表提供的方便,遍历性能只和元素多少有关。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值