Java基础

184 阅读5分钟

「这是我参与11月更文挑战的第11天,活动详情查看:2021最后一次更文挑战」。

赋值运算符

赋值运算符:=(可以连续赋值)、+=、-=、*=、/=、%=

public class SetValue {
    public static  void main(String[] args){
        int x,y;
        x=y=10;//连续赋值
        int a=10,b=20;
        int a1=b=10;//编译通过,将10赋给b,再将表达式的值赋给a,连等的话第二个必须是之前定义过的。下一行是反例
        //int a2=z=20;
        a1+=10;//a1=a1+10;
        int num=12;
        num%=5;
        System.out.println(a1);
        System.out.println(num);
        short num1=10;
        //num1=num1+2;//数据类型编译不通过
        num1+=2;//可以通过,不改变变量本身数据类型,2不是int型
        System.out.println(num1);
        System.out.println("*****************开发中实现加2操作方式**********************");
        int num3=0;//注意:变量使用前必须赋初值(尤其是局部变量)
        num3+=2;//方式一
        num3=num3+2;//方式二
        num3++;num3++;//方式三,两次++
        System.out.println("*****************练习一**********************");
        int i=1;
        i*=0.1;//编译能过,不改变变量本身数据类型,0.1化成整型0
        System.out.println(i);//0
        i++;
        System.out.println(i);//1
        System.out.println("*****************练习二**********************");
        int n=10,m=10;
        n*=(m++);//编译能过,类似于C中的运算符混合,注意优先级和是什么表达式
        System.out.println(m);//11
        System.out.println(n);//100
        n=10;
        n+=(n++)+(++n);//和C不同,+=中n=n+(n++)+(++n)中第一个n直接赋值为10,而不是两次++后的12,下同
        //注意与C中的区别     ???(略有点不理解)()上一行
        System.out.println(n);//32
        int o=2;
        o+=(o++);
        System.out.println(o);
    }
}

比较(关系)运算符

运算符解释
==等于
!=不等于
<小于
大于
<=小于等于
>=大于等于
instanceof检查是否是类的对象

比较运算符的结果都是boolean型,结果不是true就是flase

(>、<、>=、<=)只能使用在数值类型的数据之间

= =、!=不仅可以使用在数值类型的数据之间,还可以使用在引用变量类型之间

注意:==和=

public class Compare {
    public static  void main(String[] args){
        int i=10,j=20,0=20;
        System.out.println(i==j);//输出语句中放一个关系(比较)表达式,因为是boolean类型,结果为false
        System.out.println(i=j);//输出语句中也可以放表达式,赋值表达式,结果式20
        boolean x=true,y=false;//布尔型也可以用来比较
        System.out.println(x==y);//false
        System.out.println(x=y);//true
        if(o>10.0);//可以通过编译,虽然o是int,10.0是double但是可以比较,因为比较时o会变类型
        if(y==true);//可以用来进行判断,不等于执行else
        else;
    }
}

逻辑运算符

&逻辑与(全真才为真)

&&短路与(全真才为真)

|逻辑或(全假才为假)

||短路或(全假才为假)

!逻辑非(真假颠倒)

^逻辑异或(同为假,不同为真)

逻辑运算符操作的都是boolean类型的变量


public class Logic {
    public static void main(String[] args){
        boolean x=false;
        int num1=10;
        if(x&(num1++)>0){//比较运算符结果是boolean,所以可以用吧逻辑与和短路与
            System.out.println("*********");
        }else{
            System.out.println("----------");
        }
        System.out.println(num1);//11
        boolean y=false;
        int num=10;
        if(x&&(num++)>0){
            System.out.println("*********");
        }else{
            System.out.println("----------");
        }
        System.out.println(num);//10,就是说num++没有执行
        //总结:&和&&运算结果同,&&和C中的逻辑运算符一样,具备短路原则,而&没有短路一说,全部执行完
        //短路或和短路与效率更高
        int o=1;
        if(o++==1);//结果是true,o=2,注意前++和后++
        boolean a=true;
        boolean b=false;
        short c=42;
        if((c++==42)&&(b=true))c++;
        if((a=false)||(++c==45)) c++;//结果是46,注意==还是=
        System.out.println(c);//中文括号也不行,过不去编译
    }
}

位运算符

运算符运算
<<左移向左移n位相当于在原来的基础上乘了一个2n2^n(一定范围内,n太变为负数,首位移成了1)
负数一定范围内也适用(符号位保持不变,一直是1)
左移指在二进制时整体向左移动,后面出现空缺用0补齐
>>右移向右移n位相当于在原来的基础上除了一个2n2^n
右移后左边空数(正数全补0,负数全补1
>>>无符号右移不管原来是正数还是负数都拿0补
&与运算二进制位进行&运算,只有1&1时结果是1,否则是0;(全1才为1)
|或运算二进制位进行|运算,只有0|0时结果是0,否则是1;(全0才为0)
异或运算同为0,不同为1
~取反运算正数取反,各二进制码按补码各位取反
负数取反,各二进制码按补码各位取反

&、|、^是逻辑还是位取决于左右的类型,如果是布尔型就是逻辑,不是则是位

位运算是直接对整数的二进制进行的运算,位运算符操作的都是整型的数据

public class Bit {
    public static void main(String[] args){
        int i=21;
        System.out.println(i<<2);//84
        System.out.println("i<<2="+(i<<2));//84
        System.out.println("i<<2="+(4<<2));//16
        System.out.println("i<<2="+(-2<<2));//-8
        //最高效计算2*8——2<<3、8<<1
        System.out.println(4&5);//4
        System.out.println(4|5);//5
        System.out.println(4^5);//1
        System.out.println(~5);//-6
    }
}

三元运算符

(条件表达式)?表达式:表达式2;

条件表达式的结果必须是boolean类型的,结果为true执行表达式1,false执行表达式2

表达式1和2要求是一致的(不一定类型相同)

public class Condition {
    public static void main(String[] args){//三元运算符的结果需要同样的数据类型的变量接收
        //获取两个整数较大值
        int m=10,n=12,x;
        int max=(m>n)?m:n;//m和n的值必须符合前面的数据类型,且m和n不一定是一个统一的类型
        //x=m>n?2:1.0;//x不行,必须是能将两个数据类型统一起来的
        double y=m>n?2:1.0;//double就可以
        //m>n?System.out.println("***"):System.out.println("---");//编译不通过,必须是表达式
        String con=m>n?"m大":"n大";//如果m=n就不合适,所以进行嵌套
        String maxStr=m>n?"m大":(m==n?"相等":"n大");//注意m等于n不是m=n,而是m==n,前一个是赋值
        System.out.println("*************获取三个数最大值********");
        //方法一
        int a=10,b=20,c=30;
        int max0=a>b?a:b;
        int max1=max0>c?max0:c;
        System.out.println(max1);
        //方法二
        int maxOne=a>b?(a>c?a:c):(b>c?b:c);
        int maxtwo=(a>b?a:b)>c?(a>b?a:b):c;//两种方法都可以,但第二种不建议
        System.out.println(maxOne);
        System.out.println(maxtwo);
        //凡是可以用三元(目)运算符,都可以改写成if-else,反之,不成立
        //三元效率比if-else高
        //如果程序既可以使用三元运算符,又可以使用if-else结构,那么优先选择三元运算符。原因:简洁、执行效率高。
    }
}

运算符的优先级

结合性

只有单目运算符、三元运算符、赋值运算符是从右向左运算的(右结合性)。

优先级

image.png