`
univasity
  • 浏览: 811746 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

[Java基础]ArrayList和Vector的区别[收集]

阅读更多

 

关于ArrayList和Vector区别如下:
1. ArrayList在内存不够时默认是扩展50% + 1个,Vector是默认扩展1倍。
2. Vector提供indexOf(obj, start)接口,ArrayList没有。
3. Vector属于线程安全级别的,但是大多数情况下不使用Vector,因为线程安全需要更大的系统开销。

ArrayList
   ArrayList 实现了可变大小的数组。它允许所有元素,包括 null ArrayList 没有同步。
size
isEmpty get set 方法运行时间为常数。但是 add 方法开销为分摊的常数,添加 n 个元素需要 O(n) 的时间。其他的方法运行时间为线性。
  每个 ArrayList 实例都有一个容量( Capacity ),即用于存储元素的数组的大小。这个容量可随着不断添加新元素而自动增加,但是增长算法   并没有定义。当需要插入大量元素时,在插入前可以调用 ensureCapacity 方法来增加 ArrayList 的容量以提高插入效率。
  和 LinkedList 一样, ArrayList 也是非同步的( unsynchronized )。

Vector

   Vector 非常类似 ArrayList ,但是 Vector 是同步的。由 Vector 创建的 Iterator ,虽然和 ArrayList 创建的 Iterator 是同一接口,但是,因为 Vector 是同步的,当一个 Iterator 被创建而且正在被使用,另一个线程改变了 Vector 的状态(例如,添加或删除了一些元素),这时调用 Iterator 的方法时将抛出 ConcurrentModificationException ,因此必须捕获该异常。

同步性
Vector
是同步的。这个类中的一些方法保证了 Vector 中的对象是线程安全的。而 ArrayList 则是异步的,因此 ArrayList 中的对象并不是线程安全的。因为同步的要求会影响执行的效率,所以如果你不需要线程安全的集合那么使用 ArrayList 是一个很好的选择,这样可以避免由于同步带来的不必要的性能开销。

数据增长
从内部实现机制来讲 ArrayList Vector 都是使用数组 (Array) 来控制集合中的对象。当你向这两种类型中增加元素的时候,如果元素的数目超出了内部数组目前的长度它们都需要扩展内部数组的长度, Vector 缺省情况下自动增长原来一倍的数组长度, ArrayList 是原来的 50%, 所以最后你获得的这个集合所占的空间总是比你实际需要的要大。所以如果你要在集合中保存大量的数据那么使用 Vector 有一些优势,因为你可以通过设置集合的初始化大小来避免不必要的资源开销。

使用模式
ArrayList Vector 中,   从一个指定的位置(通过索引)查找数据或是在集合的末尾增加、移除一个元素所花费的时间是一样的,这个时间我们用 O(1) 表示。但是,如果在集合的其他位   置增加或移除元素那么花费的时间会呈线形增长: O(n-i) ,其中 n 代表集合中元素的个数, i 代表元素增加或移除元素的索引位置。为什么会这样呢?以为在   进行上述操作的时候集合中第 i 和第 i 个元素之后的所有元素都要执行位移的操作。这一切意味着什么呢?
这意味着,你只是查找特定位置的元素或只在集合的末端增加、移除元素,那么使用 Vector ArrayList 都可以。如果是其他操作,你最好选择其他的集合操作类。比如, LinkList 集合类在增加或移除集合中任何位置的元素所花费的时间都   是一样的 ?O(1) ,但它在索引一个元素的使用缺比较慢- O(i), 其中 i 是索引的位置 . 使用 ArrayList 也很容易,因为你可以简单的使用索引来代   替创建 iterator 对象的操作。 LinkList 也会为每个插入的元素创建对象,所有你要明白它也会带来额外的开销。
最后,在《 Practical Java 》一书中 Peter Haggar 建议使用一个简单的数组( Array )来代替 Vector ArrayList 。尤其是对于执行效率要求高的程序更应如此。因为使用数组 (Array) 避免了同步、额外的方法调用和不必要的重新分配空间的操作。
分享到:
评论

相关推荐

    JAVA基础面试题

    ArrayList和Vector的区别 ArrayList和Vector都是用数组方式存储数据,但是Vector是线程安全的,也就是说是同步的,而ArrayList是线程不安全的,不是同步的。在数据增长时,Vector默认增长为原来的一倍,而ArrayList...

    Java基础总结基础部分

    ### Java基础总结基础部分 #### 运行时异常与一般异常的区别 异常是程序运行过程中可能出现的非正常状态。在Java中,异常大致分为两大类:运行时异常和非运行时异常(也称检查型异常)。 - **运行时异常**: - ...

    最近收集的java笔试面试题

    2. ArrayList 和 Vector 的区别,HashMap 和 Hashtable 的区别 ArrayList 和 Vector 的主要区别在于同步性和数据增长。Vector 是线程安全的,也就是说是同步的,而 ArrayList 是线程序不安全的,不是同步的。同时,...

    Java程序员面试题搜集

    8. **ArrayList和Vector的区别**: - 同步性:Vector是线程安全的,ArrayList不是。 - 数据增长:Vector默认增长一倍,ArrayList增长一半。 9. **ArrayList、Vector和LinkedList的存储性能和特性**: - ...

    java工程师面试题大全100%公司笔试题你都能碰到几个

    涵盖了Java相关的知识点,包括Hibernate、HTTP协议、SMTP协议、Servlet生命周期、SQL语句分页、集合框架、final、finally、finalize的区别、ArrayList、Vector、LinkedList的存储性能和特性等。 1. Hibernate离线...

    Java后端面试问题整理.docx

    Java集合框架包括数组、HashMap、ConcurrentHashMap、HashTable、ArrayList、Vector、LinkedList、HashSet、TreeSet和LinkedHashSet。了解这些数据结构的实现原理和性能特性至关重要。 ### 并发编程 Java多线程支持...

    Java基础面试题

    - `List`接口:如ArrayList和Vector,提供了按索引访问元素的能力,支持增删改查。主要方法包括`add()`, `get()`, `remove()`, `size()`等。 - `Map`接口:如HashMap和TreeMap,存储键值对。主要方法有`put()`, `...

    vector的详细用法.txt

    根据提供的文件信息,我们可以深入探讨`Vector`在Java中的详细用法及其实现原理。`Vector`是Java中一个线程安全的动态数组实现,它继承自`AbstractList`类并实现了`List`、`Stack`接口。由于其内部通过数组来存储...

    乐其网络java笔试题目

    本篇内容主要围绕乐其网络公司针对Java程序员的笔试题目进行解析,涉及Java基础知识、面向对象特性、Servlet、集合框架、数据连接池、XML处理、JSP内置对象以及关键字final、finally和finalize的区别等多个核心知识...

    java软件工程师面试题

    8. **ArrayList和Vector的区别**: - 同步性:Vector是线程安全的,ArrayList不是。 - 数据增长:Vector默认增长一倍,ArrayList增长约为50%。 9. **ArrayList, Vector, LinkedList的存储性能和特性**: - ...

    java基础题 很全面

    以上只是部分知识点,完整的Java基础题目涵盖了异常处理、多线程、集合框架、内存管理、类和接口、线程安全、XML解析、设计模式等多个方面,对于Java程序员来说,这些都是必备知识。学习和掌握这些知识点有助于提升...

    程序员java基础面试题

    - 同步容器类(Vector、Stack、Hashtable)与并发容器类(ArrayList、LinkedList、HashMap) - 线程池(ExecutorService、ThreadPoolExecutor、Future) 7. **IO流**: - 流的分类(字节流、字符流、输入流、...

    JAVA核心面试知识整理.pdf

    ArrayList、Vector和LinkedList是List接口的三种主要实现。HashSet、TreeSet和LinkedHashSet是Set接口的实现。HashMap是Map接口的主要实现,从Java 8开始,HashMap的实现原理有所改变,引入了红黑树来优化性能。 ...

    Java面试题和答案(英文版).doc

    在Java中,**接口**和**抽象类**都是实现多态的关键机制之一,但它们之间存在一些重要的区别。 1. **方法实现**: - **抽象类**可以包含实例方法,并且这些方法可以有默认的行为实现。 - **接口**只能声明常量和...

    java问题集合适用于Java学习者

    Java 问题集合旨在帮助Java学习者巩固基础知识,其中包括类的作用域、集合框架的区别、字符编码、多线程实现以及垃圾回收机制等核心概念。 1. **类的作用域**: - `public`:任何地方都能访问。 - `private`:...

    java核心知识.pdf

    Java标签涵盖的内容非常广泛,包括但不限于Java基础语法、面向对象、异常处理、集合框架、Java I/O、网络编程、并发编程、JVM原理、类加载机制、垃圾收集机制、Java虚拟机调优等等。 从提供的部分目录和内容来看,...

    java面试题 (用心收集)

    7. **ArrayList与Vector的区别**: - `ArrayList`是非同步的,适合单线程环境,性能优于`Vector`。 - `Vector`是同步的,适合多线程环境,但性能稍逊色。 - 两者都是动态数组实现,但在扩容策略上不同,`...

    Java后端资料,面试题,后端知识点

    ArrayList和Vector都是基于数组实现的列表,但Vector是线程安全的,而ArrayList则不是。ArrayList在添加元素时默认增长约为原容量的50%,而Vector则是100%。LinkedList则使用链表实现,插入和删除操作更快,但随机...

    Java基础、Java集合、多线程、JDBC、HTTP、JSP、Servlet、Struts面试题汇总(附答案).docx

    【Java基础】 1. "=="与equals方法:在Java中,"=="是操作符,用于比较两个变量的引用是否相同,而equals是Object类的一个方法,用于比较对象的内容。默认情况下,equals方法与"=="行为一致,但可以通过重写equals来...

Global site tag (gtag.js) - Google Analytics