Java中向量的高效类型转换元素

Java中向量的高效类型转换元素,java,vector,casting,Java,Vector,Casting,有没有比这更有效的方法(最好是O(1)而不是O(n),但至少打字速度更快)来对向量的元素进行类型转换 public Vector<String> typecastVector(Vector<Object> objects){ Vector<String> strings = new Vector<String>(); for(Object o : objects) strings.add((String) o);

有没有比这更有效的方法(最好是O(1)而不是O(n),但至少打字速度更快)来对向量的元素进行类型转换

public Vector<String> typecastVector(Vector<Object> objects){
    Vector<String> strings = new Vector<String>();
    for(Object o : objects)
        strings.add((String) o);
    return strings;
}
公共向量类型castVector(向量对象){
向量字符串=新向量();
用于(对象o:对象)
字符串。添加((字符串)o);
返回字符串;
}
注 对于任何明显需要键入
向量
或其他泛型类的人:正如公认的回答者所指出的,这可能是一个问题,您可能需要在类层次结构中输入代码

<强>具体< /强>,如果还没有,则应该考虑使用“<代码>向量< /代码>或其他泛型类的类使用它们自己。当我在自己的代码中这样做时,我完全不需要在代码中使用与上述函数类似的函数


如果您从未在自己的代码中实现过泛型,请查看上面的“泛型”链接。你可能会惊讶(就像我一样)发现它们可以精确地实现你认为从
向量
类型转换中需要的功能。

如果你确实想创建一个新的独立集合,其中包含N个引用的副本,很难看出这可能是O(1)没有像写时拷贝这样的支持


您是否发现这实际上是代码中的一个性能瓶颈?有没有什么原因让你用向量而不是数组列表呢?

如果你想一想,你会发现如果你必须转换数组中的每个元素,你总是会得到O(n)


由于编译器无法预先知道对象向量中的所有对象是否都是字符串,因此不能直接强制转换向量,只能逐个元素进行转换。

这确实是最好的方法

为了将
n
元素强制转换为
字符串
,您需要“处理”所有
n
元素。这意味着运行时间的下限必须是
O(n)


就打字而言,你已经完成了所有的工作。只需将该方法放在实用程序类中,并在需要时调用它。

您可以编写一个包装器类,在提取元素时按需进行转换。如果列表很大,并且希望将性能损失延迟到实际使用某个元素时,这可能是有意义的。另一方面,它将在每次访问时强制转换每个元素,因此如果您将重复访问向量的元素,这可能是一个坏主意

在现有代码中,您最好使用正确的容量构造向量:

Vector<String> strings = new Vector<String>(objects.size());
Vector strings=新向量(objects.size());

这可能会提高效率,因为如果列表很大,它不必重复分配更多内存。

如果向量“真的”是向量,那么首先应该避免使用向量。对象是Java中的一个错误


您将得到一个编译器警告,这是有充分理由的,但您可以先将其转换为向量,然后再转换为向量。这是O(1),而且相当愚蠢,因为您稍后可能会得到一行代码,比如字符串s=vector.get(1);如果你对只包含字符串的向量不正确,给出一个ClassCastException。

如果你唯一想做的就是从一个向量到另一个向量进行强制转换,你可以这样做。不过,你必须确保向量中的每个对象都是字符串

显然,这是行不通的:

    Vector<Object> objectVector = new Vector<Object>();
    Vector<String> stringVector = (Vector<String>)objectVector;
Vector objectVector=new Vector();
Vector stringVector=(Vector)objectVector;
但你可以这样做:

    Vector<Object> objectVector = new Vector<Object>();
    Vector typelessVector = objectVector;
    Vector<String> stringVector = (Vector<String>)typelessVector;
Vector objectVector=new Vector();
向量类型lessvector=对象向量;
Vector stringVector=(Vector)无类型向量;
您将收到一些警告,但代码应该可以正常工作


正如前面提到的,这确实感觉像是一种代码气味

您正试图使用运行时功能删除编译时功能;不管怎样,仿制药正在被剥离

正如其他人所指出的,找到这个向量的来源并将其定义为向量要好得多。这样,您将使用编译器关于将“错误”对象放入向量中的警告,而不是在程序执行过程中查找是否在向量中放置了不好的对象

这段代码的一个问题是,当您从向量中获取向量时,代码可能会失败。从调试的角度来看,转换步骤失败并不是很有用。最好是在插入步骤失败,因为这样您就有机会立即对问题做出反应,而不是让它潜伏在代码的其他部分去发现


我知道你关心打字速度;但这是一个奇怪的指标。它总是更快地不转换的东西,因为它是正确键入的第一位;而且,输入速度不应该优化,因为这样做通常会以牺牲可读性、适当的代码结构、合理的设计等为代价。如果必须多次输入某个内容,也许是时候创建一个抽象基类了,或者使用其他方法允许写入所需代码的一个副本。

如果您说
向量
包含
对象
元素,则它应仅包含
对象
元素:

Vector<String> stringVector = new Vector<String>();
Vector<Object> objectVector = stringVector; // ERROR

关于这一点唯一的“可调整”是使用
新的ArrayList(objects.size())
,这将使用正确的大小初始化列表。在这个问题上,你的速度不能超过O(n)。注意:我不想创建一个独立的向量。已知原始向量包含所有字符串。阻止程序知道它们都是字符串的唯一原因是向量的通用标签是空的。如果有一种方法可以神奇地翻转标签,那么就不需要任何东西了
Vector<String> stringVector = new Vector<String>();
Vector<? extends Object> objectVector = stringVector; // OK