Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.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 使用HashSet优于HashMap的优点_Java_Hashset - Fatal编程技术网

Java 使用HashSet优于HashMap的优点

Java 使用HashSet优于HashMap的优点,java,hashset,Java,Hashset,根据javadocapi,HashSet只是HashMap的包装器。因此,在HashMap上使用HashSet可能会有任何性能优势。曾经曾经或者只是有一个适合其他情况的不同API?不,没有“性能”好处;对于正确的问题使用正确的API只会带来好处……这是相当可观的。不,没有“性能”好处;对于正确的问题,使用正确的API只会带来好处……这是相当可观的。并非真的没有性能好处,它们都有不同的用途。 关于API文档中的Hashset 这个类实现Set接口,由一个哈希表(实际上是一个HashMap实例)支持

根据javadocapi,HashSet只是HashMap的包装器。因此,在HashMap上使用HashSet可能会有任何性能优势。曾经曾经或者只是有一个适合其他情况的不同API?

不,没有“性能”好处;对于正确的问题使用正确的API只会带来好处……这是相当可观的。

不,没有“性能”好处;对于正确的问题,使用正确的API只会带来好处……这是相当可观的。

并非真的没有性能好处,它们都有不同的用途。

关于API文档中的Hashset

这个类实现Set接口,由一个哈希表(实际上是一个HashMap实例)支持。它不保证集合的迭代顺序;特别是,它不能保证订单在一段时间内保持不变。此类允许空元素

假设散列函数将元素正确地分散在存储桶中,则该类为基本操作(添加、删除、包含和大小)提供恒定的时间性能。迭代这个集合需要的时间与HashSet实例的大小(元素数)加上支持HashMap实例的“容量”(bucket数)之和成比例。因此,如果迭代性能很重要,那么不要将初始容量设置得太高(或负载系数太低),这一点非常重要

请注意,此实现是不同步的。如果多个线程同时访问哈希集,并且至少有一个线程修改该集,则必须在外部对其进行同步。这通常通过在自然封装集合的某个对象上进行同步来实现。如果不存在此类对象,则应使用Collections.synchronizedSet方法“包装”集合。最好在创建时执行此操作,以防止意外不同步地访问集合:

   Set s = Collections.synchronizedSet(new HashSet(...));
这个类的迭代器方法返回的迭代器是快速失败的:如果在迭代器创建后的任何时候,以任何方式(除了通过迭代器自己的remove方法)修改集合,迭代器将抛出ConcurrentModificationException。因此,在面对并发修改时,迭代器会快速、干净地失败,而不是在将来的不确定时间冒着任意、不确定行为的风险

请注意,无法保证迭代器的快速失效行为,因为一般来说,在存在非同步并发修改的情况下,不可能做出任何硬保证。快速失败迭代器会尽最大努力抛出ConcurrentModificationException。因此,编写依赖于此异常的正确性的程序是错误的:迭代器的快速失败行为应该只用于检测bug


检查此参考资料:

并非真的没有性能优势,它们都有不同的用途。

关于API文档中的Hashset

这个类实现Set接口,由一个哈希表(实际上是一个HashMap实例)支持。它不保证集合的迭代顺序;特别是,它不能保证订单在一段时间内保持不变。此类允许空元素

假设散列函数将元素正确地分散在存储桶中,则该类为基本操作(添加、删除、包含和大小)提供恒定的时间性能。迭代这个集合需要的时间与HashSet实例的大小(元素数)加上支持HashMap实例的“容量”(bucket数)之和成比例。因此,如果迭代性能很重要,那么不要将初始容量设置得太高(或负载系数太低),这一点非常重要

请注意,此实现是不同步的。如果多个线程同时访问哈希集,并且至少有一个线程修改该集,则必须在外部对其进行同步。这通常通过在自然封装集合的某个对象上进行同步来实现。如果不存在此类对象,则应使用Collections.synchronizedSet方法“包装”集合。最好在创建时执行此操作,以防止意外不同步地访问集合:

   Set s = Collections.synchronizedSet(new HashSet(...));
这个类的迭代器方法返回的迭代器是快速失败的:如果在迭代器创建后的任何时候,以任何方式(除了通过迭代器自己的remove方法)修改集合,迭代器将抛出ConcurrentModificationException。因此,在面对并发修改时,迭代器会快速、干净地失败,而不是在将来的不确定时间冒着任意、不确定行为的风险

请注意,无法保证迭代器的快速失效行为,因为一般来说,在存在非同步并发修改的情况下,不可能做出任何硬保证。快速失败迭代器会尽最大努力抛出ConcurrentModificationException。因此,编写依赖于此异常的正确性的程序是错误的:迭代器的快速失败行为应该只用于检测bug


检查此参考:

您可以从
HashMap
检索值,
HashSet
仅用于检查值是否存在。没有“优势”。它们用于完全不同的目的。您可以从
HashMap
检索值,
HashSet
仅用于检查值是否存在。没有“优势”。它们用于完全不同的目的。