ArrayList和Vector有什么区别?

Kus*_*alP 346 java vector arraylist

两个数据结构ArrayListVector之间有什么区别,你应该在哪里使用它们?

Sev*_*Sev 356

差异

  • 向量是同步的,ArrayLists不是.
  • 数据增长方法

如果没有特定要求使用Vectors,请使用ArrayLists.

同步

如果多个线程同时访问ArrayList,那么我们必须从外部同步代码块,从而在结构上修改列表或简单地修改元素.结构修改意味着从列表中添加或删除元素.设置现有元素的值不是结构修改.

Collections.synchronizedList 通常在创建列表时使用,以避免任何意外的不同步访问列表.

参考

数据增长

在内部,ArrayList和Vector都使用Array保存其内容.当元素插入到ArrayList或Vector中时,如果对象耗尽空间,则该对象将需要扩展其内部数组.Vector默认将其数组的大小加倍,而ArrayList将其数组大小增加50%.

参考

  • @Rei正是他所说的:_Multiple threads_(https://docs.oracle.com/javase/tutorial/essential/concurrency/index.html) (7认同)
  • 抱歉,多个线程是什么意思? (2认同)
  • @Xunie 从 ArrayList 或其他集合类读取永远不会成为问题。当您向 ArrayList 或集合添加、删除或修改现有值时,就会出现问题。 (2认同)

Ant*_*sky 85

正如文档所说,a Vector和a ArrayList几乎是等价的.不同之处在于对a的访问Vector是同步的,而对a的访问ArrayList则不是.这意味着只有一个线程可以一次调用一个方法Vector,并且在获取锁定时会有轻微的开销; 如果你使用的话ArrayList,情况并非如此.一般来说,你会想要使用ArrayList; 在单线程的情况下,它是一个更好的选择,在多线程的情况下,您可以更好地控制锁定.想要允许并发读取?精细.想要为一批10次写入执行一次同步?还好.它确实需要你更多的关心,但它可能是你想要的.另请注意,如果您有ArrayList,则可以使用Collections.synchronizedList函数创建一个同步列表,从而获得相当于一个Vector.


Boh*_*ian 52

Vector尽管它是"同步的"并且仅供学生和其他没有经验的程序员使用,但它是一个不是线程安全的破碎类.

ArrayList 是专业人士和有经验的程序员使用的首选列表实现.

想要线程安全List实现的专业人员使用a CopyOnWriteArrayList.

  • @Dineshkumar`Vector`被*打算*是线程安全的,但有一个设计缺陷使它*实际上不是线程安全的,它基本上是一个弃用的类.由于某种原因,大学等没有听说过这个消息,仍然提倡使用它. (13认同)
  • 同步但不是线程安全?这是什么意思?[我是初学者] (9认同)
  • 有趣的事实:Java1.7堆栈使用Vector类. (6认同)
  • @Dineshkumar抱歉 - 这不是一个好的链接.这是[最终答案](http://stackoverflow.com/questions/1386275/why-is-java-vector-class-considered-obsolete-or-deprecated).简而言之,它的同步是没用的. (3认同)
  • @Dineshkumar 见[这个问题](http://stackoverflow.com/questions/2144851/synchronization-in-vectors-in-java) (2认同)
  • @AdrianShum `Collections.synchronizedList()` 效率低下,几乎已被弃用。根据 javadoc,客户端必须手动同步返回的列表以安全迭代:虽然线程安全,但多个线程不能安全地并发迭代,使其成为一个残酷的、不可扩展的解决方案。它的使用已被 `java.util.concurrent` 类取代 (2认同)

Oli*_*Oli 26

ArrayList 更新,速度提高20-30%.

如果你不需要明显的东西Vector,请使用ArrayList

  • 你能否通过提供"快20-30%"的证据来支持这一说法? (31认同)
  • @user当时只是个人经验从clunking aroun巨大的阵列.三年多来,我不能指出你到底在说什么,但那里有很多基准.直到你看到最大的跳跃,但这里只有一个:http://www.javacodegeeks.com/2010/08/java-best-practices-vector-arraylist.html (5认同)
  • 请提供您的数据的证据 (2认同)

use*_*551 23

Vector和ArrayList之间有两个主要的区别.

  1. 默认情况下,Vector是同步的,而ArrayList则不是.注意:您可以通过将arraylist对象传递给Collections.synchronizedList()方法来使ArrayList同步.同步意味着:它可以与多个线程一起使用,没有任何副作用.

  2. 当空间不足以容纳新元素时,ArrayLists增加前一个大小的50%,而当没有新传入元素的空间时,Vector将增加前一个大小的100%.

除此之外,在编程工作方面,它们之间存在一些实际差异:

  1. 要从Vector获取元素在特定位置,我们使用elementAt(int index)函数.这个函数名称非常冗长.在ArrayList中,我们得到(int index)非常容易记住和使用.
  2. 类似于用Vector中的新元素替换现有元素,我们使用setElementAt()方法,这又是非常冗长的,可能会激怒程序员重复使用.代替这个ArrayList有add(int index,object)方法,它易于使用和记忆.像这样,他们在ArrayList中拥有更多程序员友好且易于使用的函数名称.

什么时候使用哪一个?

  1. 尽量避免完全使用向量.ArrayLists可以完成Vector可以执行的所有操作.默认情况下,ArrayLists的更多内容不会同步.如果需要,可以使用Collections util类在需要时同步它.
  2. ArrayList易于记忆和使用函数名称.

注意:即使arraylist增长了100%,你也可以通过ensurecapacity()方法避免这种情况,以确保你在初始阶段分配足够的内存.

希望能帮助到你.

  • ArrayLIst和Vector的增长大小错误信息(切换),否则相当不错的答案. (5认同)

roo*_*ler 14

ArrayList并且Vector都实现List接口并维护插入顺序.但是ArrayListVector类之间存在很多差异......

ArrayList -

  1. ArrayList 不同步.
  2. ArrayList 如果元素数量超过其容量,则增加当前数组大小的50%.
  3. ArrayList 它不是遗留类,它是在JDK 1.2中引入的.
  4. ArrayList 很快,因为它是非同步的.
  5. ArrayList 使用Iterator接口遍历元素.

矢量 -

  1. Vector 是同步的.
  2. Vector 如果元素总数超过其容量,则增量100%意味着数组大小加倍.
  3. Vector 是一个遗产类.

  4. Vector 因为它是同步的,所以它很慢,即在多线程环境中,它会将其他线程保持在runnable或non-runnable状态,直到当前线程释放对象的锁.

  5. Vector使用Enumeration接口遍历元素.但它也可以使用Iterator.

另请参见:https://www.javatpoint.com/difference-between-arraylist-and-vector


sub*_*his 10

基本上,ArrayList和Vector都使用内部对象阵列.

ArrayList: ArrayList类扩展AbstractList并实现List接口和RandomAccess(标记接口).ArrayList支持可根据需要增长的动态数组.它为我们提供了对元素的第一次迭代.ArrayList使用内部Object Array; 它们的默认初始大小为10.如果超出此大小,则集合将自动增加到默认大小的一半(即15).

Vector: Vector类似于ArrayList,但差异在于,它是同步的,其默认初始大小为10,当大小超过其大小时,增加到原始大小的两倍,这意味着新大小将为20. Vector是唯一的类除了ArrayList以实现RandomAccess.Vector有四个构造函数,其中一个采用两个参数Vector(int initialCapacity,int capacityIncrement) capacityIncrement是向量溢出时容量增加的量,因此它可以更好地控制加载因子.

其他一些差异是: 在此输入图像描述