在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使用这种方法?
答案 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社区期望更有意义的变量名称:)