代码之家  ›  专栏  ›  技术社区  ›  AishaWho

请解释res=id^(id>>>32)

  •  -1
  • AishaWho  · 技术社区  · 1 年前

    你好! 我有这个代码

    public int hashCode(){
            int res = (int) (id ^ (id >>> 32));
            res = 31 * res + (name != null ? name.hashCode() : 0);
            return res;
        }
    

    这是我的等号代码

        public boolean equals(Object o) {
            // object ref identical or not
            if (this == o) return true;
            if (o == null) return false;
            //class identical?
            if (getClass() != o.getClass()) return false;
            Person person = (Person) o;
    
            if(id != person.id) return false;
    
            return Objects.equals(name, person.name);
        }
    

    我不懂结果之上的运算。 为什么我们必须进行这些操作? 如果有人能向我解释,我将不胜感激

    我很理解等式,但我读到它们是以某种方式连接的,所以我附上了比较代码以备不时之需

    1 回复  |  直到 1 年前
        1
  •  -1
  •   WJS    1 年前

    请解释res=id^(id>>>32)

    • id >>> n 对于int,将id右移 n%32 而不扩展负符号位(如果存在)。所以 (id >>> 32) 实际上是==id。
    • ^ 是表示任何位的异或 a b , a^b == 1 如果 a and b 是不同的,否则他们 a^b == 0 。例如。 1^1 == 0. 0^0 == 0, 1^0 == 1

    所以 id ^ id == 0

    如果 id 是一个长的, (id>>>32) 转换高阶 32 bits 那么长 right 32 bits 然后 exclusive ors 具有该值的原始长。

    hashCode的总体计算是使用有时与其他技术一起使用的技术来生成一个数字,用于通过hashCode进行索引的数据结构。在Java中,主要示例有 Maps Sets

    这是一个演示。

    long v = Long.MIN_VALUE; // has 1 in hob (high order bit) and rest is 0's
    System.out.println(Long.toBinaryString(v));
     
    long result = v ^ (v >>> 32); // now hob should be 1 and hob of low order int should be 1
    
    System.out.println(Long.toBinaryString(result));
    1000000000000000000000000000000000000000000000000000000000000000
    1000000000000000000000000000000010000000000000000000000000000000