Java HashMap和HashSet有什么共同点?

Java HashMap和HashSet有什么共同点?,java,hashmap,hashset,Java,Hashmap,Hashset,在任何地方,你都可以找到答案,区别是什么: Map正在存储键值,它不是同步的(不是线程安全的),允许空值和一个空键,因为所有值都有唯一的键,所以获取值的速度更快,等等。 集合-未排序,获取值较慢,仅存储值,不允许重复或空值 但是Hash单词的意思是什么(这就是它们的相同之处)。是关于散列值还是其他我希望你能清楚回答我的问题 两者都不是线程安全的,使用hashCode()存储值。这些是共同的事实。另一个是两者都是Java集合框架的成员。但这两者之间有很多不同之处 两者都不是线程安全的,使用hash

在任何地方,你都可以找到答案,区别是什么:

Map正在存储键值,它不是同步的(不是线程安全的),允许空值和一个空键,因为所有值都有唯一的键,所以获取值的速度更快,等等。 集合-未排序,获取值较慢,仅存储值,不允许重复或空值


但是Hash单词的意思是什么(这就是它们的相同之处)。是关于散列值还是其他我希望你能清楚回答我的问题

两者都不是
线程
安全的,使用
hashCode()
存储值。这些是共同的事实。另一个是两者都是Java集合框架的成员。但这两者之间有很多不同之处

两者都不是
线程
安全的,使用
hashCode()
存储值。这些是共同的事实。另一个是Java集合框架的成员。但这两者之间有很多不同之处

HashSet就像一个HashMap,您不关心值,只关心键。 因此,您只关心给定的键K是否在集合中,而不关心它映射到的值V(您可以将其视为V是常数,例如,对于HashSet中的所有键,V=Boolean.TRUE)。所以HashSet没有值(V set)。从结构的角度来看,这就是整个差异。散列部分意味着,当将元素放入结构Java时,首先调用hashCode方法。另请参阅,以了解发动机罩下发生的一般情况。


哈希值用于更快地检查两个对象是否相同。如果两个对象具有相同的散列,则它们可以相等,也可以不相等(因此,使用equals方法比较它们是否相等)。但是如果它们有不同的散列,它们肯定是不同的,不需要检查相等性。这并不意味着,如果两个对象具有相同的哈希值,那么当它们存储在HashSet或HashMap中时,它们会相互覆盖。

HashSet就像一个HashMap,您不关心值,只关心键。 因此,您只关心给定的键K是否在集合中,而不关心它映射到的值V(您可以将其视为V是常数,例如,对于HashSet中的所有键,V=Boolean.TRUE)。所以HashSet没有值(V set)。从结构的角度来看,这就是整个差异。散列部分意味着,当将元素放入结构中时,Java首先调用hashCode方法。另请参阅,以了解发动机罩下发生的一般情况。


哈希值用于更快地检查两个对象是否相同。如果两个对象具有相同的散列,则它们可以相等,也可以不相等(因此,使用equals方法比较它们是否相等)。但是如果它们有不同的散列,它们肯定是不同的,不需要检查相等性。这并不意味着,如果两个对象具有相同的哈希值,那么当它们存储在HashSet或HashMap中时,它们会相互覆盖。

都使用对象的哈希值来存储,该值在内部使用
hashCode()对象类的方法


因此,如果要存储自定义类的实例,则需要重写
hashCode()方法

都使用对象的哈希值来存储,该值在内部使用
hashCode()对象类的方法


因此,如果要存储自定义类的实例,则需要重写
hashCode()方法

HashSet
HashMap
有许多共同点:

  • 他们名字的开头-这是一个线索,以真正的相似性
  • 它们使用散列代码(来自所有Java对象中内置的
    hashCode
    方法)来快速处理和组织对象
  • 它们都是无序集合-但都提供有序变量(
    LinkedHashX
    以按添加顺序存储对象)
  • 还有
    TreeSet
    /
    TreeMap
    对集合中存在的所有对象进行排序并保持其排序。将TreeSet与TreeMap进行比较,会发现HashSet和HashMap之间存在非常相似的差异和相似之处
  • 一般来说,它们还受到散列算法的优势和局限性的影响

  • 只有当对象具有性能良好的哈希函数时,哈希才有效
  • 如果
    equals
    hashCode
    没有遵循正确的约定,则哈希将完全中断
  • 映射中的关键对象和集合中的对象应该是不可变的(或者至少它们的
    hashCode
    equals
    返回值永远不应该更改),否则行为将变得未定义
  • 如果您查看Map API,还可以看到许多其他有趣的连接,例如
    keySet
    entrySet
    都返回
    Set


    没有一个Java集合是线程安全的。其他软件包中的一些较旧的类被删除了,但它们大部分已经退役。对于线程安全,请查看
    并发
    包对于非线程安全,请查看
    集合
    包。

    哈希集
    哈希映射
    有许多共同点:

  • 他们名字的开头-这是一个线索,以真正的相似性
  • 它们使用散列代码(来自所有Java对象中内置的
    hashCode
    方法)来快速处理和组织对象
  • 它们都是无序集合-但都提供有序变量(
    LinkedHashX
    以按添加顺序存储对象)
  • 还有
    TreeSet
    /
    TreeMap
    对集合中存在的所有对象进行排序并保持其排序。将TreeSet与TreeMap进行比较,会发现HashSet和HashMap之间存在非常相似的差异和相似之处
  • 一般来说,它们还受到散列算法的优势和局限性的影响

  • 散列只是
    public class HashSet<E>
    
    ...
    
        private transient HashMap<E,Object> map;
    
        // Dummy value to associate with an Object in the backing Map
        private static final Object PRESENT = new Object();
    
        /**
         * Constructs a new, empty set; the backing <tt>HashMap</tt> instance has
         * default initial capacity (16) and load factor (0.75).
         */
        public HashSet() {
            map = new HashMap<>();
        }
    
    ...
    
        public boolean contains(Object o) {
            return map.containsKey(o);
        }
    
    ...
    
        public boolean add(E e) {
            return map.put(e, PRESENT)==null;
        }
    
    ...
    
    }