【发布时间】:2012-03-04 09:35:03
【问题描述】:
我正在尝试制作一个名为 myHash 的点的 HashSet 的浅表副本。截至目前,我有以下几点:
HashSet<Point> myNewHash = (HashSet<Point>) myHash.clone();
然而,这段代码给了我一个未经检查的强制转换警告。有没有更好的方法来做到这一点?
【问题讨论】:
我正在尝试制作一个名为 myHash 的点的 HashSet 的浅表副本。截至目前,我有以下几点:
HashSet<Point> myNewHash = (HashSet<Point>) myHash.clone();
然而,这段代码给了我一个未经检查的强制转换警告。有没有更好的方法来做到这一点?
【问题讨论】:
另一个答案建议使用new HashSet<Point>(myHash)。但是,clone() 的意图是获取相同类型的新对象。如果myHash 是HashSet 的子类的实例,则使用new HashSet<Point>(myHash) 将丢失由子类添加的任何附加行为。
未经检查的强制转换警告只是一个警告。在许多情况下强制转换是安全的,但编译器不够聪明,无法确定它是安全的。但是,您可以将警告隔离到可以使用@SuppressWarnings("unchecked") 注释的单个方法中:
@SuppressWarnings("unchecked")
static <T implements Cloneable> clone(T o) { return (T)(o.clone()); }
【讨论】:
你可以试试这个:
HashSet<Point> myNewHash = new HashSet<Point>(myHash);
【讨论】:
addAll(myHash),因此它会遍历集合并手动添加每个元素,而clone() 使用包私有方法@987654324 更快地重建底层地图@ ... sigh 这正是我多年前编写自己的 HashMap/HashSet 的原因,而这正是今天存在如此多 Collection 替代品的原因...
HashSet,然后调用addAll。使用构造函数和手动调用addAll 之间的唯一区别是可读性,并且构造函数将容量计算打包以实现所需的负载因子 0.75。你有任何关于你的方法与股票构造函数的性能数据吗?
HashSet 的负载因子的两个参数的构造函数。使用clone() 将保留对原始集(好或坏)有效的任何加载因子。