如何在Java中创建一个字符串向量数组?

4
我使用以下代码尝试创建一个字符串向量的数组,希望有一个包含三个项目的数组,每个项目都是一个字符串向量:
Vector<String> Result_Vector_Array[]=new Vector<String>[3];

但是NB将该行标记为错误(通用数组创建),这是什么原因?正确的做法是什么?我知道还有ArrayList,但它不是同步的,所以我想使用Vector。


什么是字符串向量? - Mnementh
矢量不是已经被弃用了吗? - Tom
请使用ArrayList代替!!! - jjnguy
开始使用resultVectorArray名称吧!!! ;) - OscarRyz
Vector不是被弃用的。只有很少的东西被弃用了。 - Tom Hawtin - tackline
7个回答

6
由于 类型擦除,JVM在运行时不知道你有一个包含 StringVector。它所能做的最好的事情就是创建一个“未加工”的 Vector。它不能保证所有的 Vector 都实际包含 String。这就是为什么你会收到IDE的警告。

解决此问题的一种方法是像 jgubby 建议的那样进行转换。另一种方法是将一个 List 放入你的 Vector 中,而不是一个数组。

但更重要的是,为什么数组只能有三个元素?创建一个包含三个字段的类放入你的 Vector 中是否更好?对于三个元素来说,这并不需要太多的工作,你还可以给每个元素赋予一个有用的名称,这应该可以使你的代码更加清晰易懂。

另外,自Java 6以来,出现了许多有用的新同步List实现,这些实现可能比Vector表现更好,例如CopyOnWriteArrayList,或者将常规List包装在Collections.synchronizedList中。


创建一个类!是的,好主意,这打开了更多的可能性,谢谢! - Frank

5
您不能这样创建一个数组,应该这样做:
Vector<String> Result_Vector_Array[] = (Vector<String>[]) new Vector[3];

我建议使用不同的方法 - 像这样的容器数组通常很难使用,并且不利于理解您的代码。
PS 还值得注意的是,Java命名约定应该是
 Vector<String> resultVectorArray[] = (Vector<String>[]) new Vector[3];

通常情况下,在名称中不包括类型(我怀疑这可能会引起争议!),为什么不只称其为“result”,让类型系统来担心类型?


我不明白为什么。泛型类型在哪里?String是一个具体类,如果我们将Vector参数化,那么Vector也将是一个具体类。或者呢? - Geo
谢谢,我使用这种方法是因为我知道数组的维度,但不知道向量中会有多少元素,向量会随着使用而增长,直到完成任务我才能知道它们的大小。有更好的解决方案吗? - Frank

1

您也可以创建:

Vector<Vector<String>> Result_Vector_Array=new Vector<Vector<String>>( );

或者你可以用其他集合替换Vector


1

我建议继续使用集合,可以这样做:

Collection<Vector<String>> resultVectorArray = new ArrayList<Vector<String>>(3);

然后您可以使用构造函数与泛型,实际上具有相同的效果。


0

使用反射,它将是:

    Vector<String>[] arrayOfVectors = 
      (Vector<String>[]) java.lang.reflect.Array.newInstance(Vector.class, size);
    java.util.Arrays.fill(arrayOfVectors, new Vector<String>());
    for (Vector<String> v : arrayOfVectors) {
        System.out.println(v);
    }

你也可以使用ArrayList,然后使用Collections#synchronizedList(java.util.List)进行包装。


因为你不能创建一个数组作为 Vector<String> Result_Vector_Array[] = (Vector<String>[]) new Vector[3]; - dfa

0
如果你想使用同步的ArrayList,你可以在java.util.Collections中使用synchronizedList方法。
ArrayList<String> a1 = new ArrayList<String>();
ArrayList<String> a2= new ArrayList<String>();
ArrayList<String> a3 = new ArrayList<String>();

ArrayList<String> array[] = (ArrayList<String>[]) new ArrayList[3];

array[0]= Collections.synchronizedList(a1);
array[1]= Collections.synchronizedList(a2);
array[2]= Collections.synchronizedList(a3);

-1

我应该理解你要在那个数组上使用多线程吗?...

如果你不是,那么你就不必担心同步问题。

我会:

    List<List<String>> listOfLists = new ArrayList<List<String>>();

    List<String> firstVector = new ArrayList<String>();

    firstVector.add( "one" );
    firstVector.add( "two" );

    listOfLists.add(  firstVector );

    System.out.println( listOfLists.get(0).get(0) == "one" );
    System.out.println( listOfLists.get(0).get(1) == "two" );

输出 true, true


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