Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在这种情况下,我应该使用什么样的收藏?_Java_List_Loops_Collections_Set - Fatal编程技术网

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
,并且不考虑性能,除非您已经证明这是应用程序中的一个问题。