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

Fau*_*lva 3 c++ java

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

std::vector<int> vec(10);
vec.insert(vec.begin()+2,2);
vec.insert(vec.begin()+4,3);
Run Code Online (Sandbox Code Playgroud)

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

Vector l5 = new Vector(10);
l5.add(0, 1);
l5.add(1, "Test");
l5.add(3, "test");
Run Code Online (Sandbox Code Playgroud)

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

Cyr*_* Ka 8

在C++代码中:

std::vector<int> vec(10);
Run Code Online (Sandbox Code Playgroud)

您正在创建一个大小为10的向量.因此,从0到9的所有索引都是有效的.

在Java代码中:

Vector l5 = new Vector(10);
Run Code Online (Sandbox Code Playgroud)

您正在创建一个初始容量为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());
}
Run Code Online (Sandbox Code Playgroud)

  • 在Java中,你不应该使用`Vector`,请参考[为什么Java Vector类被认为是过时的或弃用的?](http://stackoverflow.com/q/1386275/1065197).相反,请建议使用`List <YourClass>`备份`ArrayList <YourClass>`. (3认同)