java运算符详解

java基础(2)--运算符详解

自增自减规则

自增自减就是常用的 a = a++ 或者 a = ++a;前者是后缀式,先把a赋值给a,再加一;后者是后缀式,先加一,在赋值给a;而且a++,++a并不是原子操作,在当线程环境下并不会出错,当放在多线程下时,就会出现数据错误的问题。

public class Test01 {
    private static int a = 0;
    private static int b = 0;
    private static AtomicInteger atomicInteger = new AtomicInteger(0);

    public static void main(String[] args) throws InterruptedException {
        for (int i = 0; i < 10; i++){
            Thread t = new Thread() {
                @Override
                public void run() {
                    for (int i = 0; i < 1000; i++) {
                        a = a + 1;
                        b++;
                        atomicInteger.incrementAndGet();
                    }
                }
            };
            t.start();
        }
        // 给计算机运算的时间
        Thread.sleep(2000);
        System.out.println("a = a + 1: " + a);
        System.out.println("b++ :" + b);
        System.out.println("原子操作: " + atomicInteger);
        Thread.sleep(3000);
        System.out.println("a = a + 1: " + a);
        System.out.println("b++ :" + b);
        System.out.println("原子操作: " + atomicInteger);
    }
}

结果是

a = a + 1: 9526
b++ :9930
原子操作: 10000
a = a + 1: 9526
b++ :9930
原子操作: 10000

所以在多线程环境下进行自增自减时要注意加锁,因为缩略的自增自减其实是两个操作。另外我还发现a+++b,以及a---b都是采用了贪心策略,即从左至右运算的运算符会尽可能的匹配运算符,所以你会发现a--b会报错。

&和&&的区别

&&我们都用过,但是&有谁用过呢?他和&&有用什么不同呢,我们直接上代码一探究竟:

public class Test02 {
    public static void main(String[] args) {
        int a = 1;
        int c = 0;
        // 只要&&前面的等式有一个错了,就不会管后面的条件
        if (a < c && a / c > 0){
            System.out.println("&&");
        }
//        if(a > c && a / c > 0){
//            System.out.println();
//        }
 
        System.out.println("--------");
        // 即使前面的等式错误,也要判断完所有的条件
        if (a < c & a / c > 0){
            System.out.println("&");
        }
    }
}

结果:

--------
Exception in thread "main" java.lang.ArithmeticException: / by zero
    at base.Test02.main(Test02.java:15)

显然,&和&&都具有逻辑与的功能,只有在所有条件都满足的情况下才进入if代码块,只不过&&具有短路性,对于&&运算符两端的等式,从左往右执行该等式,只要有一个 等式不满足就直接跳出if代码块,而&运算符,总是会判断完所有的条件等式。

你可能感兴趣的:(java运算符详解)