Java 在这种情况下,我应该使用什么样的收藏?
在这个用例中,我需要在集合Java 在这种情况下,我应该使用什么样的收藏?,java,list,loops,collections,set,Java,List,Loops,Collections,Set,在这个用例中,我需要在集合x中存储一组项。如果项目已经存在(没有重复项),我不想将其插入x。我也不关心插入顺序。尺寸x变化很大(在构建x后使用集合来构建x时可能非常小。u可以简单地将内容复制到数组或任何其他类型,以提高时间复杂度,但要以空间复杂度为代价。在构建x后使用集合来构建x时,u可以简单地将内容复制到数组或任何其他类型,以提高时间复杂度xity是以空间复杂性为代价的。检查列表是否已经包含该元素的成本要高得多 迭代一个集合比迭代一个列表稍微慢一点,但不是很慢,而且只需要一个常数因子,而检查列
x
中存储一组项。如果项目已经存在(没有重复项),我不想将其插入x
。我也不关心插入顺序。尺寸x
变化很大(在构建x后使用集合来构建x时可能非常小。u可以简单地将内容复制到数组或任何其他类型,以提高时间复杂度,但要以空间复杂度为代价。在构建x后使用集合来构建x时,u可以简单地将内容复制到数组或任何其他类型,以提高时间复杂度xity是以空间复杂性为代价的。检查列表是否已经包含该元素的成本要高得多
迭代一个集合
比迭代一个列表
稍微慢一点,但不是很慢,而且只需要一个常数因子,而检查列表
中元素的包含情况会花费每个元素的线性时间,并使整个事情变成二次的。检查列表的成本要高很多ode>已包含该元素
迭代一个集合
比迭代一个列表
稍微慢一点,但不是很慢,而且只需要一个常数因子,而检查列表
中某个元素的包含情况会花费每个元素的线性时间,并使整个事情变成二次的。如果需要快速检查某个项目是否已读取y存在时,HashSet肯定是最佳选择,因为它在内部使用HashMap,所以每次查找都是O(1)。
虽然此查找的列表非常昂贵,因为它逐个检查所有元素
当您需要迭代所有元素时,使用List和Set并没有什么区别
值得注意的是,HashSet将使用更多的内存,但是10到数千应该不会造成问题
因此,HashSet显然是您案例的赢家。如果您需要能够快速检查项目是否已经存在,HashSet肯定是最佳选择,因为它内部使用HashMap,因此每次查找都是O(1)。
虽然此查找的列表非常昂贵,因为它逐个检查所有元素
当您需要迭代所有元素时,使用List和Set并没有什么区别
值得注意的是,HashSet将使用更多的内存,但是10到数千应该不会造成问题
因此,HashSet显然是您案例的赢家。我建议使用,因为它的添加和删除操作在O(1)
中运行(假设哈希代码分布均匀)。在添加/删除元素方面,它的效率可能低于HashSet
,但如果在添加大量元素后删除了许多元素,那么它应该具有更好的迭代性能
在这种情况下,通常应该避免使用O(n)
进行查找。我建议使用,因为它的添加和删除操作在O(1)
中运行(假设哈希代码分布均匀)。在添加/删除元素方面,它的效率可能低于HashSet
,但如果在添加大量元素后删除了许多元素,那么它应该具有更好的迭代性能
在这种情况下,通常应避免使用O(n)
进行查找。我建议将数据插入地图以避免重复项,然后将地图转换为列表
如果您使用的是Java8,那么您可以这样做
List<Object> result = map.entrySet().stream()
.map(x -> x.getKey())
.collect(Collectors.toList());
List result=map.entrySet().stream()
.map(x->x.getKey())
.collect(Collectors.toList());
我建议将数据插入地图以避免重复项目,然后将地图转换为列表
如果您使用的是Java8,那么您可以这样做
List<Object> result = map.entrySet().stream()
.map(x -> x.getKey())
.collect(Collectors.toList());
List result=map.entrySet().stream()
.map(x->x.getKey())
.collect(Collectors.toList());
搜索操作将是O(n)
列表中的O(1)
Map
中的
。如果你不关心元素的顺序,也不想重复,那么你应该选择Set
。迭代Set
应该不是问题,你可以使用迭代器
或增强的进行
循环。我也投票支持Set
,并且不考虑性能,除非您证明这是应用程序中的问题。搜索操作将是列表中的O(n)
和O(1)Map
中的
。如果你不关心元素的顺序,也不想重复,那么你应该选择Set
。迭代Set
应该不是问题,你可以使用迭代器
或增强的进行
循环。我也投票支持Set
,并且不考虑性能,除非您已经证明这是应用程序中的一个问题。