1.算术运算符:

+,-,*,/,%, ++,--。

A. 二元运算符

+,-,*,/,%

没什么好说的,这最要注意的是,%,取余,在Java中叫模运算,运算时要注意精度问题。

运算时,byteshort 类型运算后的结果为 int类型。

示例:

package operator;

public class Demo01 {
    public static void main(String[] args) {
        int i1 = 10 ;
        int i2 = 20 ;
        int i3 = 30 ;
        int i4 = 40 ;

        System.out.println(i1+i2);
        System.out.println(i2-i3);
        System.out.println(i3*i4);
        System.out.println(i1/i4); //输出结果为0,产生精度问题 10/40 = 0.4
        System.out.println((double)i1/i4); //输出0.25,要强转
    }
}

输出:

30
-10
1200
0
0.25

示例二:

package operator;

public class Demo02 {
    public static void main(String[] args) {
        byte b1 = 10 ;
        short s1 = 21 ;
        int i1 = 31 ;
        long l1 = 400L ; //Long 类型,加后缀L
        float f1 = 5.1F ; //浮点类型,加后缀F
        double d1 = 3.14 ;
        System.out.println(b1+s1);
        System.out.println(l1-s1);
        System.out.println(l1*f1);
        System.out.println(d1/b1);
        System.out.println(b1%s1); //结果为10,%求余,Java中叫求模运算
        /*
        System.out.println((String) (b1+b1)); //byte 相加,提示cannot cast 'int' to java.lang.String
        System.out.println((String) (s1+s1)); //short 相加,提示cannot cast 'int' to java.lang.String
        System.out.println((String) (i1+i1)); //int 相加 ,提示cannot cast 'int' to java.lang.String
        System.out.println((String) (l1+l1)); //long 相加,提示cannot cast 'long' to java.lang.String
        System.out.println((String) (f1+f1)); //float 相加,提示cannot cast 'float' to java.lang.String
        System.out.println((String) (d1+d1)); //double 相加,提示cannot cast 'double' to java.lang.String
        */
        
        /*
        System.out.println((String) (b1+s1)); // byte short 相加,提示cannot cast 'int' to java.lang.String
        System.out.println((String) (l1+s1)); // short long 相加,提示cannot cast 'long' to java.lang.String
        System.out.println((String) (l1+f1)); // long float 相加,提示cannot cast 'float' to java.lang.String
        System.out.println((String) (d1+b1)); // double byte 相加,提示cannot cast 'double' to java.lang.String
        */
    }
}
可以看出 byteshort 类型参与运算时,会自动转换为 int 类型,其他类型依然按照 低到高的原始处理(参考:Java基础语法05 - 数据类型转换)。

B. 自增,自减一元运算符:

++, --
a++ ==> a=a+1;
++a ==> a=a+1;
//两者一样

示例:

package operator;

public class Demo04 {
    public static void main(String[] args) {
        //一元运算符, ++ --
        int a = 3;
        int b = a++ ; //相当于 b = a,a = a + 1
        int c = ++a ; //a = a + 1, 相当于 c = (a = a + 1)

        System.out.println(a); //5, a 自增2次,所以是5
        System.out.println(b); //3, 先赋值,再自增,所以是3
        System.out.println(c); //5,先自增,再赋值,所以是5

    }
}

C. 幂运算

幂运算用到数学工具类 Math类,结果是double类型。

package operator;

public class Demo04 {
    public static void main(String[] args) {
        //数学工具类 Math Math.pow -> 数学求次方
        double d1 = 3;
        double d2 = 2;
        System.out.println(Math.pow(d1,d2)); //3^2 = 9;
    }
}

输出:

9.0

2.赋值运算符:

=

3.关系运算符:

>,<,>=,<=,==,!=,instanceof (判断一个对象是否为一个类的实例)。

返回结果只能是布尔值 true / false

示例:

package operator;

public class Demo03 {
    public static void main(String[] args) {
        //关系运算符 运算结果是布尔值,只能返回 true 或 false。
        int i1 = 10 ;
        int i2 = 20 ;
        float i3 = 10.0F ;
        int i4 = 10 ;
        double i5 = 10.0001 ;
        float i6 = 10.0001F ;
        byte i7 = 10 ;
        System.out.println(i1>i2); //false
        System.out.println(i1<i2); //true
        System.out.println(i1>=i5); //false 10 小于 10.0001F
        System.out.println(i1<=i3); //true 10 等于 10.0F
        System.out.println(i5!=i6); //ture 10.001 与 10.0001F 不相等
        System.out.println(i1==i5); //false 10 不等于 10.0001
        System.out.println(i1==i3); //true 10 与 10.0F相等
        System.out.println(i1>i7); //int 10 不大于 byte 10
    }
}

输出:

false
true
false
true
true
false
true
false
可以看到 低容量与高容量类型对比相同的值是一样的。

但double 和float 相同的值,比较的结果不一样,前面说过的精度问题。

4.逻辑运算符:

&&,||,!。

&& 逻辑与运算:两个变量都为真,结果才为true。

|| 逻辑或运算:两个变量只要有一个为真,结果就是true,也就是说只有2个都为false 时才为 false。

非运算:如果变量为真,结果为false,如果变了为假,结果为true。非就是取反的意思。

示例:

package operator;

public class Demo05 {
    public static void main(String[] args) {
        //逻辑运算符
        // &&(and 与),|| (or 或),!(非,取反)
        boolean flag1 = true ;
        boolean flag2 = false ;

        System.out.println("flag1 && flag2: " + (flag1&&flag2) ); // false, and,只有两个为真,结果才为真
        System.out.println("flag1 || flag2: " + (flag1||flag2) );// ture, or, 只有两个为假,结果才粉假
        System.out.println("!(flag1 && flag2): " + !(flag1&&flag2) ); // true, Opposite, 取反操作
    }
}

输出:

flag1 && flag2: false
flag1 || flag2: true
!(flag1 && flag2): true
中间涉及短路运算,也就是说 当操作 &&时,第一个为假的时候,直接返回false,&&后面的不执行,代码被直接短路跳过了。
同时理,执行||操作时,第一个为真时,直接返回真,||后面的条件不执行。

短路运算:

示例:

package operator;

public class Demo05 {
    public static void main(String[] args) {
        //短路运算
        int i = 4;
        boolean b1 = i<4 && (++i>4) ; //and,只要第一个为假,结果为假,直接返回false,没有执行 '&&' 后面的i++
        System.out.println(b1); // false
        System.out.println(i);  // 4, i++没被执行
        System.out.println("==========");

        boolean b11 = (i>=4) && (++i>4) ; //and,两个为真,结果才为真
        System.out.println(b11); // true
        System.out.println(i);  // 5
        System.out.println("==========");

        int i2 = 4;
        boolean b2 = i2>3 || (i2++>4) ; // or,只要第一个为真,结果为真,直接返回true,同样没执行 '||' 后面的代码
        System.out.println(b2); //true
        System.out.println(i2); // 4,i2++没被执行
        System.out.println("==========");

        boolean b21 = (i2>4) || (i2++>4) ; //and,两个为假,结果才为假,证明先执行了逻辑运算i2>4,再执行的自增运算i2++
        System.out.println(b21); // false
        System.out.println(i);  // 5
        System.out.println("==========");
    }
}

输出:

false
4
==========
true
5
==========
true
4
==========
false
5
==========

Process finished with exit code 0
也就是说,当执行&&运算时,只有第一个为真,第二个条件才有机会被执行。
当执行||运算时,只有第一个为假,第二个才有机会被执行。

5.位运算符:

&,|,^,~,>>,<<,>>>。

位运算逻辑上与关系运算一样的,只是位运算是跟据位来的,二进制的运算。

  • &与运算,11为1,其他为0;
  • | 或运算,00为0,其他为1;
  • ^异或运算,相同为0,不同为1;
  • ~取反,就是0变1,1变0;

示例:

package operator;

public class Demo06 {
    public static void main(String[] args) {
        //位运算
        /*
        A = 0011 1100 ;
        B = 0000 1101 ;
        ---------------------
        A&B = 0000 1100 ; and 11为1,其他为0;
        A|B = 0011 1101 ; or 00为0,其他为1;
        A^B = 0011 0001 ; xor 同为0,不同为1;
        ~B = 1111 0010 ; and 11为1,其他为0;
         */

        //2*8 怎么运算最快?
        //答案是 位运算,直接跟计算机底层打交道,效率高
        //这里要用到的位运算符是: 左移<< 右移>>
        // << *2 左移相当于X2^n,n为移动位数
        // >> /2 右移相当于/2^n
        /*
        0000 0000      0
        0000 0001      1
        0000 0010      2
        0000 0011      3
        0000 0100      4
        0000 1000      8
        0001 0000      16  //2^4
         */
        System.out.println(2<<3); //16
        System.out.println(1<<3); //8
        System.out.println(3<<3); //24
    }
}

输出:

16
8
24

关于异或运算:

异或,是一个数学运算符,英文为 exclusive OR,缩写为 xor,应用于逻辑运算。异或的数学符号为“ ⊕ ”,计算机符号为“ xor ”。

如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0。

拓展:

异或也叫半加运算,其运算法则相当于不带进位的二进制加法:二进制下用1表示真,0表示假,则异或的运算法则为:0⊕0=0,1⊕0=1,0⊕1=1,1⊕1=0(同为0,异为1),这些法则与加法是相同的,只是不带进位。
异或略称为XOR、EOR、EX-OR

6.条件运算符(三元运算符):

? :

x?y:z 如果x为true,则结果为y,如果x为false,结果为z。

示例:

package operator;

public class Demo08 {
    public static void main(String[] args) {
        //三元运算符
        // x?y:z ; 如果X真,结果y;否则结果为Z。
        int score = 90 ;
        String total = (score>60)?"及格":"不及格" ;
        System.out.println(total);

    }
}

输出:

及格

7.扩展赋值运算符:

+=,-=,*=,/+。

a+=b;相当于 a = a+b;其他一样

package operator;

public class Demo07 {
    public static void main(String[] args) {
        int a = 10 ;
        int b = 20 ;
        
       // b+=a ; //30 b = b+a
        b-=a ; //10 b = b-a
        System.out.println(b); //10

        //字符串连接符 +
        // + 旁边出现 String类型,哪里出现String,String两边的+为字符串连接符,其他是正常运算的+(加号)。
        System.out.println("" + a+b); //1010 相当于""+"1010"
        System.out.println(a+b+""); //20 相当于 "20"+""
        System.out.println(a+b+""+a+b); //201010 相当于 "20" + "1010"
    }
}

输出:

10
1010
20
201010
文章目录