我使用下面的代码尝试创建一个字符串向量数组,我希望有一个包含3个项目的数组,每个项目都是一个字符串向量:
Vector<String> Result_Vector_Array[]=new Vector<String>[3];
但NB强调该行为错误(通用数组创建),有什么不对?这样做的正确方法是什么?我知道还有Arraylist,但它没有同步,所以我想使用vector。
答案 0 :(得分:6)
由于type erasure,JVM在运行时不知道您有Vector
String
。它能做的最好的就是创建一个'原始'矢量。并不能保证所有Vector
实际上都包含String
个。这就是您从IDE收到警告的原因。
解决这个问题的一种方法是,正如jgubby建议的那样。另一种方法是将List
放入Vector
,而不是数组。
但是,更重要的是,为什么阵列只有3个项目?创建一个包含三个字段的类来放入Vector
不是更好吗?有三个项目,这不是太多的工作,你得到额外的奖励,你可以给三个元素中的每一个一个有用的名称,这将使你的代码更清晰。
此外,自Java 6以来,存在许多有用的新同步List
实现,这些实现可能比Vector
执行得更好,例如CopyOnWriteArrayList
,或者包装常规{{1}在Collections.synchronizedList
。
答案 1 :(得分:5)
您不能创建这样的数组,请执行以下操作:
Vector<String> Result_Vector_Array[] = (Vector<String>[]) new Vector[3];
我建议采用不同的方法 - 像这样的容器数组通常很难使用,并且无助于理解你的代码。
PS另外值得注意的是java命名约定是
Vector<String> resultVectorArray[] = (Vector<String>[]) new Vector[3];
并且通常不会在名称中包含类型(我怀疑这会引起争议!),为什么不把它称为'结果'并让类型系统担心类型?
答案 2 :(得分:1)
您还可以创建:
Vector<Vector<String>> Result_Vector_Array=new Vector<Vector<String>>( );
或者您可以将Vector
替换为其他一些集合。
答案 3 :(得分:1)
我建议保留收藏品,做点什么
Collection<Vector<String>> resultVectorArray = new ArrayList<Vector<String>>(3);
然后你可以在构造函数中使用泛型,并且几乎说出相同的效果
答案 4 :(得分: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)
将其包装答案 5 :(得分: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);
答案 6 :(得分:-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" );
打印真实,真实