Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在使用向量之前,是否必须对其执行setSize()操作?_Java_Java Me - Fatal编程技术网

Java 在使用向量之前,是否必须对其执行setSize()操作?

Java 在使用向量之前,是否必须对其执行setSize()操作?,java,java-me,Java,Java Me,给定 以下三行在同一类的实例方法中 private final Vector v = new Vector(); //instance variable 我在第3行获得了一个数组索引OutofBoundsException 调试器显示向量有10个元素。 length显示10 size显示0 为什么会引发此异常,我是否需要执行setSize()以使用向量v?否,但在获取元素之前必须添加元素 Vector是老式的Java1.0。它默认使用同步化,这会影响性能。为什么不考虑使用较新的java.ut

给定

以下三行在同一类的实例方法中

private final Vector v = new Vector();  //instance variable
我在第3行获得了一个
数组索引OutofBoundsException

调试器显示
向量有10个元素。
length
显示
10

size
显示
0


为什么会引发此异常,我是否需要执行
setSize()
以使用
向量v

否,但在获取元素之前必须添加元素


Vector是老式的Java1.0。它默认使用同步化,这会影响性能。为什么不考虑使用较新的java.util.List和java.util.ArrayList类?

否。该向量为10个元素保留了空间。但是它还没有包含任何你需要使用“put”向向量添加内容的元素

长度将告诉您保留的空间量,大小将告诉您实际可以使用的空间量


向量通常会保留比优化所需更多的空间

容量是为当前和未来元素分配的空间,是一个内部(向量)编号,出于性能原因而公开。容量等于或大于其包含的元素数量

size()显示您在向量中放置了多少元素。该能力更多的是在性质上属于内部记账的载体。您只能获取元素0。。。getSize()-向量中的1

也就是说,如果不在多个线程中使用数据,那么最好使用ArrayList

您可以使用isEmpty()检查向量是否为空,它应该执行getSize()==0之类的操作。

capacity()方法告诉您,在向量必须增加其容量之前,它可以接受许多元素。它不会告诉您当前向量中有很多元素,这就是size()的作用。在你的例子中是这样的,因为向量是空的

您可以通过向构造函数提供参数来指定容量:

1.    int length = v.capacity();   
2.    int size = v.size();
3.    Object o = v.getElementAt(0);
编辑

根据您对其他帖子的评论,您的应用程序中似乎有两个线程——一个将内容放入向量,另一个读取向量

然后,在尝试从中获取元素之前,必须添加一个控制结构来检查向量是否为空

肮脏的例子:

Vector v = new Vector(20);
/* This vector will have the starting capacity
   of 20 elements, before it has to increase
   its capacity */


Vector v = new Vector(10, 5);
/* This vector will have an initial capacity
   of 10 elements, and when it overflows the
   second parameter tells the vector to increase
   its capacity by 5. */

正如一些人提到的,您不想查看向量的容量,或者(相当于)其内部数组的长度。在实践中,您几乎不想查看向量的容量。您需要使用size()(或isEmpty(),当且仅当size()返回0时,它才返回true)

尝试对不存在的元素调用getElementAt(x)不会返回null。它抛出一个异常。

因为有另一个线程插入元素,所以可能需要检查大小并以原子方式检索元素。实际上,听起来好像您正在尝试实现生产者/消费者队列,在这种情况下,您还希望将该元素作为同一原子操作的一部分删除。最直接的方法是在向量上同步。例如:

/* Vector instantiation goes here */

boolean keepRunningFlag = true;
while(keepRunningFlag) {
    if (!vector.isEmpty()) {
        Object o = vector.remove(vector.size() - 1);
        keepRunningFlag = doStuffWithVectorElement(o);
    }
}
此代码有几个注意事项:

  • 如果v变大,这将变得效率低下,因为移除向量中的第一个元素会将所有剩余元素移动一个。如果这是一个问题,您可能需要查找或编写队列类
  • 如果在向量中插入null,o也将设置为null。这可能是你的问题,也可能不是

实际上,向量是由另一个线程提供的元素,第二个线程正在读取这些元素。我试图在v.getElementAt(0)之后检查对象o是否为null。这难道不是正确的方法吗?正如extraneon所说,在J2ME中使用它,也编辑了有问题的标记。我实际上在Java ME/CLDC1.0中使用它,它没有ArrayList类。上面问题的解决方案是什么?在使用向量之前,我必须先执行v.isEmpty()。另外,请阅读我对duffymo关于线程的回答。正如这篇文章中的许多回答所说,在向向量添加任何元素之前,我试图访问一个元素。因此得到了一个例外
Object o = null;
synchronized(v) {
    if (!v.isEmpty()) {
        o = v.getElementAt(0);
        v.removeElementAt(0);
    }
}
// at this point the first element of the vector will be removed
// (if there was one) and o be pointing at that first element. If
// the Vector was empty, o will still be null.