与的区别

12次阅读

共计 1142 个字符,预计需要花费 3 分钟才能阅读完成。

前序

在看 HashMap 源码的时候,看到 HashMap 的 hash 函数里面有用到 >>> 的运算符,之前经常在除 2 操作用到 >> 运算符,但是还是第一次看到 >>>,于是就来记录一下。

情景复现

hashMap 的 hash 函数源码

因为里面主要是先获取 key 的 hashCode,这是 jvm 生成的,所以我单独用 1 模拟 hashCode

System.out.println((h = 1) ^ (h >>> 16));

结果如下

情景复现:1

步骤解析

这段代码主要由三段代码运算而成

  1. h 直接赋值为 1
  2. h>>>16 位
  3. 步骤 1 与步骤 2 的异或运算

所以从结果推断出 1 >>>16 结果为 0

测试

System.out.println("-12>>>2 结果为:"+Integer.toBinaryString(-12>>>2));
System.out.println("12>>>2 结果为:"+Integer.toBinaryString(12>>>2));
System.out.println("-12>>2 结果为:"+Integer.toBinaryString(-12>>2));
System.out.println("12>>2 结果为:"+Integer.toBinaryString(12>>2));
-12>>>2 结果为:111111111111111111111111111101
12>>>2 结果为:11
-12>>2 结果为:11111111111111111111111111111101
12>>2 结果为:11

分析

从结果可以看出,利用正数做操作时,>> 与 >>> 结果没有变化,但是负数的操作时发生了变化,这个对比证明了 >>> 的操作与符号位有关。

  • 正数操作

由于位运算时,利用 Integer.toBinaryString 方法输出不会输出前置 0,所以可以推断两个运算符的操作都是右移 n 位补 0

  • 负数操作

由于负数存储的是它的补码,在进行 >> 运算的时候明显看到生成的二进制字符串补 1,且长度比正数运算的时候要长,java 在二进制中是不区分符号位的,所以最后的十进制表示的数会异常大。

总结

两个运算符,在进行正数移位的时候操作是一样的。但是在处理负数时,>> 补 1,是带符号操作的。而 >>> 补 0,是无符号操作的。

    本文首发于 cartoon 的博客
     转载请注明出处:https://cartoonyu.github.io/cartoon-blog/post/java/%E6%97%A0%E7%AC%A6%E5%8F%B7%E8%BF%90%E7%AE%97%E7%AC%A6%E4%B8%8E%E6%9C%89%E7%AC%A6%E5%8F%B7%E8%BF%90%E7%AE%97%E7%AC%A6%E7%9A%84%E5%8C%BA%E5%88%AB/

正文完
 0

与的区别

12次阅读

共计 1143 个字符,预计需要花费 3 分钟才能阅读完成。

前序

在看 HashMap 源码的时候,看到 HashMap 的 hash 函数里面有用到 >>> 的运算符,之前经常在除 2 操作用到 >> 运算符,但是还是第一次看到 >>>,于是就来记录一下。

情景复现

hashMap 的 hash 函数源码

因为里面主要是先获取 key 的 hashCode,这是 jvm 生成的,所以我单独用 1 模拟 hashCode

System.out.println((h = 1) ^ (h >>> 16));

结果如下

情景复现:1

步骤解析

这段代码主要由三段代码运算而成

  1. h 直接赋值为 1
  2. h>>>16 位
  3. 步骤 1 与步骤 2 的异或运算

所以从结果推断出 1 >>>16 结果为 0

测试

System.out.println("-12>>>2 结果为:"+Integer.toBinaryString(-12>>>2));
System.out.println("12>>>2 结果为:"+Integer.toBinaryString(12>>>2));
System.out.println("-12>>2 结果为:"+Integer.toBinaryString(-12>>2));
System.out.println("12>>2 结果为:"+Integer.toBinaryString(12>>2));
-12>>>2 结果为:111111111111111111111111111101
12>>>2 结果为:11
-12>>2 结果为:11111111111111111111111111111101
12>>2 结果为:11

分析

从结果可以看出,利用正数做操作时,>> 与 >>> 结果没有变化,但是负数的操作时发生了变化,这个对比证明了 >>> 的操作与符号位有关。

  • 正数操作

由于位运算时,利用 Integer.toBinaryString 方法输出不会输出前置 0,所以可以推断两个运算符的操作都是右移 n 位补 0

  • 负数操作

由于负数存储的是它的补码,在进行 >>> 运算的时候明显看到生成的二进制字符串补 1,且长度比正数运算的时候要长,java 在二进制中是不区分符号位的,所以最后的十进制表示的数会异常大。

总结

两个运算符,在进行正数移位的时候操作是一样的。但是在处理负数时,>> 补 0,是无符号操作的。而 >>> 补 1,是带符号操作的。

    本文首发于 cartoon 的博客
     转载请注明出处:https://cartoonyu.github.io/cartoon-blog/post/java/%E6%97%A0%E7%AC%A6%E5%8F%B7%E8%BF%90%E7%AE%97%E7%AC%A6%E4%B8%8E%E6%9C%89%E7%AC%A6%E5%8F%B7%E8%BF%90%E7%AE%97%E7%AC%A6%E7%9A%84%E5%8C%BA%E5%88%AB/

正文完
 0

==与===的区别

12次阅读

共计 369 个字符,预计需要花费 1 分钟才能阅读完成。

== 检查值相等, 允许类型转换 === 检查值和类型相等,不允许类型转换
那么在不同情况下应该使用 == 还是 ===
(1)如果要比较的两个值的任意一个(即一边)可能是 true 或者 false 值,那么要避免使用 ==,而使用 ===。
(2)如果要比较的两个值中的任意一个可能是特定值(0、”” 或者 []——空数组),那么避免使用 ==,而使用 ===
(3)在所有其他情况下,使用 == 都是安全的。不仅仅只是安全而已,这在很多情况下也会简化代码,提高代码的可读性
如果你能够确定这些值,并且 == 是安全的,那么就可以使用它!如果不能确定其值,那么就使用 ===。
如果是比较两个非原生值的话,比如对象(包括函数和数组),那么需要特殊注意 == 与 === 这些比较规则。因为这些值通常是通过引用访问的,所以 == 和 === 比较只是简单地检查这些引用是否匹配,而完全不关心其引用的值是什么。

正文完
 0