std :: vector和java.util.Vector之间的差异

时间:2013-02-27 19:44:23

标签: java c++

在C ++中,我可以将项插入向量中的任意位置,就像下面的代码一样:

std::vector<int> vec(10);
vec.insert(vec.begin()+2,2);
vec.insert(vec.begin()+4,3);

在Java中我不能这样做,我得到一个异常java.lang.ArrayIndexOutOfBoundsException,代码如下:

Vector l5 = new Vector(10);
l5.add(0, 1);
l5.add(1, "Test");
l5.add(3, "test");

这意味着C ++设计得更好还是仅仅是Java设计决策? 为什么java使用这种方法?

3 个答案:

答案 0 :(得分:8)

在C ++代码中:

std::vector<int> vec(10);

您正在创建尺寸10 的矢量。因此,从0到9的所有索引都是有效的。

在Java代码中:

Vector l5 = new Vector(10);

您正在创建一个初始容量为10的向量。这意味着基础数组的大小为10,但向量本身的大小为0.

这并不意味着一个设计比另一个更好。 API只是与众不同,这并不是让一个人比另一个更好的差异。

请注意,在Java中,现在优先使用ArrayList,它具有几乎相同的API,但未同步。如果你想在Java的Vector中找到一个糟糕的设计决策,那么每个操作的这种同步可能就是一个。

因此,在Java中编写等效的C ++初始化代码的最佳方法是:

List<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < 10; i++){
    list.add(new Integer());
}

答案 1 :(得分:2)

Vector.add(int, Object)的Javadoc非常明确地指出,如果索引小于零或大于或等于大小,将抛出IndexOutOfBoundsException。 Vector类型根据需要增长,您使用的构造函数设置初始容量,该容量与大小不同。请阅读链接的Javadoc以更好地了解如何使用Vector类型。此外,我们的Java开发人员通常使用List类型,例如在通常在C ++中使用std :: vector的情况下使用ArrayList。

答案 2 :(得分:1)

的差异?你不能比较两种语言的做法。通常Vector确实使用堆栈数据结构或LinkedList(或可能是两者)。这意味着,你把一个项目放在顶部,把另一个项目放在它上面,另一个项目甚至放在它上面,就像明智一样。在LinkedList中,它有点不同,你“拉”值但是相同的东西。所以在C ++中最好使用push_back()方法。

C ++ Vector对象自动实例化。但是在Java中它不是,你必须填写它。我不同意使用l5.add(1, "Test");填充它的方法。使用l5.add("test")

由于您提出了差异,您也可以通过这种方式定义对象

 Vector a = new Vector();

没有类型,在Java中我们称之为Generics。自Java 1.6以来可能

Vector现在还没有在Java中广泛使用。它有延误。我们现在使用位于ArrayList界面内的List移动。

修改

l5等变量名在C ++中被广泛使用。但Java社区期望更有意义的变量名称:)