Java运算符操作及注意点

Java运算符操作及注意点

1、算术运算

/:除法运算符的两个运算数都是整数类型,则计算结果也是整数,就是将自然除法的结果截断取整。

%两个操作数中至少一个是浮点数,允许第二个操作数是0或0.0,但是求余运算的结果是NaN。0或0.0对零以外的任何数求余都将得到0或0.0.

5%0、5%0.0、5.0%0、0.0%0

public static void main(String[] args) {
        System.out.println(5%0);  // java.lang.ArithmeticException: / by zero
        System.out.println(5.0%0);  // NaN
        System.out.println(5%0.0);  // NaN
        System.out.println(0.0%0);  // NaN
        System.out.println(0%0.0);  // NaN
        System.out.println(0%0);  // java.lang.ArithmeticException: / by zero
        System.out.println(0%5);  // 0
        System.out.println(0.0%5); // 0.0
    }

2、赋值运算

赋值表达式是有值的,赋值表达式的值就是右边被赋的值。如String str2 = str表达式的值就是str。--> 连续赋值成立

3、比较运算符

==(!=):只有当两个引用变量引用的相同类的实例时才可以比较,而且必须这两个引用指向同一个对象才会返回true(!=:两个引用变量均为同一类的实例才可比较

如果两个对象不是同一个类比较时编译报错吗?会

public static void main(String[] args) {
        String str = new String("254");
        Integer i = new Integer("254");
        // 编译报错Incompatible(矛盾、不匹配) operand types String and Integer
        System.out.println(str == i); 
    }

引用类型的缓存问题

Java运算符操作及注意点

这与java的Integer类的设计有关。

String类型的缓存:

String str1 = new String(“string”);
String str2 = new String(“string”);
str1 == str2 // false
String str3 = “hello”;
String str4 = “hello”;
str3 == str4 // true

因为执行String str3 = “hello”;时,系统会创建一个内容为”hello”的String实例,并将这个实例缓存起来,当第二次执行String str4=”hello”时,系统会先检查缓存中是否有一个String实例的内容与这个”hello”直接量(字面量)的字符序列相同,如果从缓存中找到这样一个String实例,系统会直接让这个引用指向这个String实例。

缓存的意义:缓存是一种非常优秀的设计模式。java将一些创建成本大,需要频繁使用的对象进行缓存,从而提高程序的运行性能。

4、位运算

Java运算符操作及注意点Java运算符操作及注意点

5、移位运算

Java运算符操作及注意点Java运算符操作及注意点

移位运算规则

●对于低于int类型(如byte,short和char)的操作数总是先自动类型转换为int类型后再移位;

●对于int/long类型的整数移位a>>b,当b>32(64)时,先对b做32(64)求余,再移位。

幂运算:java.lang.Math类的pow() 方法:

public static double pow(double a, double b);   // ab

instanceof:在运行时指出对象是否是特定类的一个实例。返回一个布尔值。

字符串连接符: + 

优先级问题,优先使用括号。

&  >  ^  >  |  >  &&  >  ||  >  ?:

6、扩展的赋值运算符

byte a = 5; a = a + 5; // 报错,将int型的5赋值给byte型

byte a = 5; a += 5; // 不报错 --> 什么机制?
b += 1,其实等价于 b = (byte)(b+1);底层会对这个结果进行强转的,所以它编译的时候没事,如果b是127, 那么加1后变成128了,成了int类型了,超过了byte类型的最大范围了,系统会强转,把int类型的 前面三个高位丢弃,丢弃后,如果剩下的一位中,最高位为1,则取反加一,就成了负数了,如果最高位为0,直接把值赋给

--> 如果可以使用扩展运算符,推荐总使用这种扩展后的运算符