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

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代码块,而&运算符,总是会判断完所有的条件等式。

原文地址:https://www.cnblogs.com/curiousforcode/p/12003202.html

时间: 2024-09-27 06:36:19

java基础(2)--运算符详解的相关文章

Java的位运算符详解实例

Java的位运算符详解实例——与(&).非(~).或(|).异或(^).右移(>>).左移(<<).无符号右移(>>>) 位运算符主要针对二进制, 它包括了:“与”.“非”.“或”.“异或”."右移"."左移"."无符号右移". 从表面上看似乎有点像逻辑运算符, 但逻辑运算符是针对两个关系运算符来进行逻辑运算, 而位运算符主要针对两个二进制数的位进行逻辑运算. 下面详细介绍每个位运算符. 1.与运

[转]Java的位运算符详解实例——与(&amp;)、非(~)、或(|)、异或(^)

位运算符主要针对二进制,它包括了:“与”.“非”.“或”.“异或”.从表面上看似乎有点像逻辑运算符,但逻辑运算符是针对两个关系运算符来进行逻辑运算,而位运算符主要针对两个二进制数的位进行逻辑运算.下面详细介绍每个位运算符. 1.与运算符与运算符用符号“&”表示,其使用规律如下:两个操作数中位都为1,结果才为1,否则结果为0,例如下面的程序段.public class data13{public static void main(String[] args){int a=129;int b=128

java基础之:详解内部类(转载)

可以将一个类的定义放在另一个类的定义内部,这就是内部类. 内部类是一个非常有用的特性但又比较难理解使用的特性(鄙人到现在都没有怎么使用过内部类,对内部类也只是略知一二). 第一次见面 内部类我们从外面看是非常容易理解的,无非就是在一个类的内部在定义一个类. [java] view plain copy print? public class OuterClass { private String name ; private int age; public String getName() {

Java基础:泛型详解

泛型在java中有很重要的地位,在面向对象编程及各种设计模式中有非常广泛的应用.什么是泛型?为什么要使用泛型? 泛型,即“参数化类型”.一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参.那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参).泛型的本质是为了参数化类型(在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型).也

Java基础之序列化详解

相关定义及用途 java序列化(又叫串行化)技术可以使你将一个对象的状态写入一个Byte流里,并且可以从其他地方把该Byte流里的数据读出来,重新构造一个相同的对象.这种机制允许你将对象通过网络进行传播,并可以随时把对象持久化到数据库.文件等系统里.java的序列化机制是RMI(远程方法调用).EFB等技术的技术基础. 用途:利用对象的序列化实现保存应用程序的当前工作状态,下次再启动的是时候将自动恢复到上次执行的状态. 序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化.可

Java千问:Java语言位运算符详解

很多编程语言都有位运算符,Java语言也不例外.在Java语言中,提供了7种位运算符,分别是按位与(&).按位或(|).按位异或(^).取反(~).左移(<<).带符号右移(>>)和无符号右移(>>>).这些运算符当中,仅有~是单目运算符,其他运算符均为双目运算符.在讲解这些运算符的使用之前,必须了解一个常识,那就是:位运算符是对long.int.short.byte和char这5种类型的数据进行运算的,我们不能对double.float和boolean进

java基础篇---枚举详解

在JDK1.5之前,JAVA可以有两种方式定义新类型:类和接口,对于大部分面向对象编程,有这两种似乎就足够了,但是在一些特殊情况就不合适.例如:想要定义一个Color类,它只能有Red,Green,Blue三种,其他值则是错误,在JDK1.5之后便引入枚举类型. 枚举其实就是一种类型,跟int, char 这种差不多,就是定义变量时限制输入的,你只能够赋enum里面规定的值. public enum Color{ RED,GREEN,BLUE ; // 定义三个枚举的类型 }; 枚举中有三个取值

Java的位运算符详解实例——与(&amp;)、非(~)、或(|)、异或(^)

位运算符主要针对二进制,它包括了:"与"."非"."或"."异或".从表面上看似乎有点像逻辑运算符,但逻辑运算符是针对两个关系运算符来进行逻辑运算,而位运算符主要针对两个二进制数的位进行逻辑运算.下面详细介绍每个位运算符. 1.与运算符 与运算符用符号"&"表示,其使用规律如下: 两个操作数中位都为1,结果才为1,否则结果为0,例如下面的程序段. public class data13 { publ

Java基础之ThreadPoolExecutor详解

Spring中的ThreadPoolTaskExecutor是借助于JDK并发包中的java.util.concurrent.ThreadPoolExecutor来实现的.基于ThreadPoolExecutor可以很容易将一个Runnable接口的任务放入线程池中. ThreadPoolExecutor的构建参数: public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeU

Java基础(52):ClassCastException详解(转)

ClassCastException,从字面上看,是类型转换错误,通常是进行强制类型转换时候出的错误.下面对产生ClassCastException异常的原因进行分析,然后给出这种异常的解决方法. 这种异常是如何产生的呢?举一个比较形象的例子. Animal表示动物,Dog表示狗,是动物的子类,Cat表示猫,是动物的子类.看下面的代码: 1 Animal a1 = new Dog(); // 1 2 Animal a2 = new Cat(); // 2 3 4 Dog d1 = (Dog)a1