Java 克隆集和减法集-这有用吗? 私有HashMap AllDataObjects; ... /**返回不在指定集中的所有DataObject元素*/ 私有数据对象[]反转(哈希集) { HashSet keys=(HashSet)AllDataObjects.keySet(); keys=(HashSet)keys.clone(); 钥匙。拆除所有(套); 返回(DataObject[])键。toArray(); }

Java 克隆集和减法集-这有用吗? 私有HashMap AllDataObjects; ... /**返回不在指定集中的所有DataObject元素*/ 私有数据对象[]反转(哈希集) { HashSet keys=(HashSet)AllDataObjects.keySet(); keys=(HashSet)keys.clone(); 钥匙。拆除所有(套); 返回(DataObject[])键。toArray(); },java,collections,clone,set,subtraction,Java,Collections,Clone,Set,Subtraction,请注意,我不想通过此过程更改AllDataObjects。我将AllDataObjects”键集(这是我想要set参数减去的DataObject的键集)铸造到一个HashSet中,以使用clone,它应该返回一个浅拷贝,然后我可以从中删除set,而不影响AllDataObjects 这看起来对吗?创建一个新集合,并将要克隆的集合作为参数。这避免了强制转换,因此不会丢失泛型 private HashMap<DataObject, HashSet> AllDataObjects; ..

请注意,我不想通过此过程更改
AllDataObjects
。我将
AllDataObjects
”键集(这是我想要
set
参数减去的
DataObject
的键集)铸造到一个HashSet中,以使用clone,它应该返回一个浅拷贝,然后我可以从中删除
set
,而不影响
AllDataObjects


这看起来对吗?

创建一个新集合,并将要克隆的集合作为参数。这避免了强制转换,因此不会丢失泛型

private HashMap<DataObject, HashSet> AllDataObjects;

...

/** Returns all DataObject elements that are NOT in the specified set. */
private DataObject[] invert( HashSet<DataObject> set )
{
    HashSet<DataObject> keys = (HashSet) AllDataObjects.keySet();
    keys = (HashSet) keys.clone();

    keys.removeAll( set );

    return (DataObject[]) keys.toArray();
}
私有数据对象[]反转(集合){
Set keys=newhashset(AllDataObjects.keySet());
钥匙。拆除所有(套);
返回keys.toArray(新数据对象[]{});
}

还值得注意的是,您应该使用Set而不是HashSet作为参数,以避免给客户机带来过多负担。

知道这些集合是由关系查询填充的,我建议您至少在编写一个更好的SQL查询以获得所需内容时,不要在内存中执行。原因有几个。首先,大多数关系数据库都经过优化,可以比代码更有效地完成这项工作。第二,让运行关系数据库的服务器完成更多的工作。第三,如果集合的大小变大,您将不得不返回结果,为它们分配内存,然后扔掉不需要的结果,这将给中间层带来不必要的负担。

如果您必须:


我还没有使用数据库,但我计划得太早了。基本设计中有几个部分我还没有解决,我现在更喜欢用普通代码来解决。事实上,你可以说你应该将这个论点声明为Collections这是使用Google Collections的最佳时机。您可以执行Set.difference来生成一个SetView对象,它的内存效率更高,可能更快。更不用说代码了。
private DataObject[] invert( Set<DataObject> set ){
    Set<DataObject> keys = new HashSet<DataObject>(AllDataObjects.keySet());
    keys.removeAll( set );
    return keys.toArray(new DataObject[]{});
}