Java编程思想拾遗(3) 操作符

323 阅读2分钟

关系操作符

  • 任何对象的==都是内存地址比较,基本类型的==是值比较。
  • 对象默认的equals是内存地址比较,大多数Java类库覆写成内容比较。

按位操作符

编译器自行进行二进制的转换和运算,并将结果转回原来的进制。

按位操作符可与等号=联合使用,以便合并运算和赋值,按位与&=、按位或|=、按位异或^=都是和合法的,非~是一元操作符,所以不可与=联合使用。

我们将布尔类型作为一种单比特值对待,所以它多少有点独特,我们可对它执行按位与、或、异或运算,但不能执行按位非,对于布尔值,按位操作符具有与逻辑操作符相同的逻辑,只是它们不会中途短路,会全部计算得出最后的结果。

移位操作符

  • 左移位操作符(<<)低位补0
  • 有符号右移位操作符(>>)高位补符号
  • 无符号右移位操作符(>>>)高位补0 如果对char、byte或者short类型的数值进行移位处理,那么在移位进行之前,它们会被转换成int类型,并且得到的结果也是一个int类型的值,只有数值右端的低5位才有用,这样可防止我们移位超过int型值所具有的位数,2^5=32,long同理是6位。

类型转换操作符

在适当的时候,Java会将一种数据类型自动转换成另一种,称为类型提升。如果是反向操作窄化转换,需要显式转换,自行承担丢失风险。

如果对基本数据类型执行算术运算或按位运算,只要类型比int小,那么在运算之前,这些值会自动转换成int,这样一来,最终生成的结果就是int类型,如果想把结果赋值给较小的类型,就必须使用类型转换。

{
    short s1 = 1;
    short s2 = 2;
    int i1 = s1 & s2;
    int i2 = s1 + s2;
}

Java允许我们把任何基本数据类型转换成别的基本数据类型,但布尔型除外,后者根本不允许进行任何类型的转换处理。

常见错误

{
    while(x = y) {
        // ...
    }
}

由于Java不会自动地将int数值转换成布尔值,所以在编译时会抛出异常,唯一不会得到编译时错误的情况是x和y都为布尔值,即便如此,while还是会陷入死循环。