Java的Vector.add()和Vector.addElement()有何区别?

18
请解释一下Vector.add()方法和Vector.addElement()方法的区别,同时提供一个示例代码片段。

我觉得很奇怪,我们有这么多关于向量的问题,然后我意识到它们都来自同一个用户。 - Michael Mrozek
1
这个方法在功能上与add(Object)方法相同(它是List接口的一部分)。add(Object)是由于Vector实现了List接口,并且自Java 1.2以来出现,当时Vector被移动到Collections中:早期版本的集合类Vector和Hashtable已经被改装为实现集合接口。addElement是“原始”Vector的方法。 - David Titarenco
1
@David,这是一个非常好的LMGTFY版本——下面有一些很棒的答案,你的评论并不是必要的。 http://meta.stackexchange.com/questions/15650/ban-lmgtfy-let-me-google-that-for-you-links 可能值得一读。 - Mark Elliot
一些反-LMGTFY政策在我看来只是鼓励懒惰。下次我会简述那些只需0.2秒就能在谷歌上找到的答案,并获得高赞。 - David Titarenco
@David 你说喜欢上网查资料是件坏事——如果你不知道答案而你认为可以通过谷歌找到,那么这就是你应该做的。你会得到声望,问题也会被解决。 - Michael Mrozek
5个回答

29

add()方法来自Java集合框架中的List接口,该框架在Java 1.2中添加。而Vector早于此并与其结合使用。具体差异如下:

  1. addElement()synchronized的,而add()不是。在Java集合框架中,如果您希望这些方法同步,请将集合包装在Collections.synchronizedList()中;而

  2. add()返回成功的布尔值,而addElement()返回void类型。

技术上讲,synchronized的差异并不是API的一部分,而是实现细节。

推荐使用List方法。就像我说的,如果您想要一个synchronizedList,可以执行以下操作:

List<String> list = Collections.synchronizedList(new ArrayList<String>());
list.add("hello");

1
-1,你没有完全给出答案。两种方法的使用示例没有给出样本代码。 - camickr
1
@camickr 如果你要抱怨,请将其保留在你/我的答案中,并让至少一个好的答案得到投票,以便搜索这个问题的人可以轻松地找到答案,而不是浏览无意义的内容。 - Michael Mrozek
4
@camickr,基本上你是在报复一个(应该的)踩票,并通过更糟糕的行为使一个差劲的答案变得更糟。我认真建议你想办法以成熟的方式与SO社区互动(出于你自己的利益)。 - cletus
不用担心,我没有给你的回答点踩,我只是在讽刺你的回答并没有回答问题。答案是“没有区别,代码是一样的”。如果你花时间阅读API,就会发现其中一个返回布尔值。如果问题是“为什么有两个做同样事情的方法”,或者“为什么一个方法返回布尔值”,那么我会理解OP花时间阅读API但仍然感到困惑。我不认为引用API中的信息有助于帮助发布者长期解决问题。教会发布者阅读技巧才是更好的帮助! - camickr
2
@cletus,我认为你错了,因为这两个函数都是同步的。 public synchronized void addElement(E obj) public synchronized boolean add(E e) - Mahmoud Emam

6
方法签名不同,add 方法返回 true,而 addElement 方法为 void。
来自 http://www.docjar.com/html/api/java/util/Vector.java.html
  153       public synchronized boolean add(E object) {
  154           if (elementCount == elementData.length) {
  155               growByOne();
  156           }
  157           elementData[elementCount++] = object;
  158           modCount++;
  159           return true;
  160       }

并且

223       public synchronized void addElement(E object) {
  224           if (elementCount == elementData.length) {
  225               growByOne();
  226           }
  227           elementData[elementCount++] = object;
  228           modCount++;
  229       }

从技术上讲是正确的,但不是真正的原因,因为添加的返回值硬编码为true,并没有告诉你任何有用的信息。 - Michael Mrozek
实际上,add返回true(阅读代码,它从不返回false)。 - Mark Elliot
谢谢,是的,这只返回True。但它返回一个值,而另一个是void。 - Jubal
1
Vector类和addElement方法都不是final的,因此可以扩展Vector并覆盖addElement方法。理论上,扩展可以具有完全不同的行为(包括有用的返回值)。如果他们想要强制addElement等效于add,则应该这样编写:public final synchronized addElement(E object){add(object); return true;} - emory

5

javadoc提到:

public void addElement(E obj)

该方法与 add(E) 方法(List 接口的一部分)的功能相同。

它们都存在的原因是(来自同一份 javadoc):

从Java 2平台v1.2开始,这个类被改装为实现List接口,成为Java Collections Framework的成员。

List有一个add方法,所以在Vector中添加了一个实现,但为了保持向后兼容性,addElement没有被删除。


-1,对于勺子喂食和在方法描述中找到的答案,请不要翻译。 - camickr
4
你是认真的吗?你要因为在你的“RTFM”帖子上的争论而对我的完整回答进行负投票吗? - Michael Mrozek

1

addElement

这个方法在功能上与 add(Object) 方法相同(它是 List 接口的一部分)。

因此,以下两种方式没有区别:

Vector v = new Vector();
v.addElement( new Object() );

并且

Vector v = new Vector();
v.add( new Object() );

这个类(vector)自Java1.0以来就存在,现在基本上被稍微更快的ArrayList所取代。


0

主要区别 -> add() 方法总是返回 true,而 addElement() 没有返回值。

详细来说: addElement(object) 方法在功能上与 add(Object) 方法相同(它是 List 接口的一部分)。

add(Object ) 是因为 Vector 实现了 List 接口,并且自 Java 1.2 以来就出现了:早期版本的集合类 Vector 和 Hashtable 已经过改进,以实现集合接口。

addElement 是“原始”的 Vector 方法。

在这里找到了答案.. Vector 中 add() 和 addElement() 的区别是什么?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接