Java运算符

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java运算符相关的知识,希望对你有一定的参考价值。

1 算术运算符

运算符顾名思义是一种符号,它是连接一个以上的操作符,实现某种功能的运算。

我们就先来认识一下算术运算符吧!

算术运算符用在数学表达式中,主要实现的是算术运算,如我们常见的加法减法乘法除法等。

表格中的例子中,变量a的值为5,变量b的值为3,变量i的值为1:

算术运算符名称描述类型举例
+ 加法 相加运算符两侧的值 双目运算符 a + b 等于 8
- 减法 左操作数减去右操作数 双目运算符 a - b 等于 2
* 乘法 相乘操作符两侧的值 双目运算符 a * b 等于 15
/ 除法 左操作数除以右操作数 双目运算符 a / b 等于 1
% 取余 左操作数除右操作数的余数 双目运算符 a % b 等于 2
++ 自增 操作数的值增加1 单目运算符 ++i(或i++) 等于2
-- 自减 操作数的值减少1 单目运算符 --i(或i--) 等于0

  

其中,自增(++)和自减(--)运算符有两种写法:前缀(++i,--i)后缀(i++,i--)

  • 前缀自增自减法(++i,--i): 先进行自增或者自减运算,再进行表达式运算。
  • 后缀自增自减法(i++,i--): 先进行表达式运算,再进行自增或者自减运算

我们在 Eclipse 上来直观的感受一下吧!

第一步,我们先新建一个工程,然后新建一个包,再在包下新建一个源代码文件。(可参考第章一节,代码的类名要和源代码文件名一致)。

接下来输入以下代码,进行验证吧,同学们也可自行组织代码验证一下。

public class Test {

    public static void main(String args[]) {
        int a = 5;
        int b = 3;
        int c = 3;
        int d = 3;
        System.out.println("a + b = " + (a + b));
        System.out.println("a - b = " + (a - b));
        System.out.println("a * b = " + (a * b));
        System.out.println("a / b = " + (a / b));
        System.out.println("a % b = " + (a % b));
        System.out.println("a++ = " + (a++));
        System.out.println("++a = " + (++a));
        System.out.println("b-- = " + (b--));
        System.out.println("--b = " + (--b));
        System.out.println("c++ = " + (c++));
        System.out.println("++d = " + (++d));
    }
}

运行结果:

技术分享图片

大家可以发现++在变量的左边和右边,赋值得到的结果是不一样的,自减也是同样的道理。

2 位运算符

Java定义了位运算符,应用于整数类型(int),长整型(long),短整型(short),字符型(char),和字节型(byte)等类型。位运算时先转换为二进制,再按位运算。

表格中的例子中,变量a的值为60,变量b的值为13:

位运算符名称描述举例
& 按位与 如果相对应位都是1,则结果为1,否则为0 (a&b),得到12,即0000 1100
按位或 如果相对应位都是0,则结果为0,否则为1 (a丨b)得到61,即 0011 1101
^ 按位异或 如果相对应位值相同,则结果为0,否则为1 (a^b)得到49,即 0011 0001
~ 按位补 翻转操作数的每一位,即0变成1,1变成0 (?a)得到-61,即1100 0011
<< 按位左移 左操作数按位左移右操作数指定的位数 a<<2得到240,即 1111 0000
>> 按位右移 左操作数按位右移右操作数指定的位数 a>>2得到15即 1111
>>> 按位右移补零 左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充 a>>>2得到15即0000 1111

接下来输入以下代码,进行验证吧,同学们也可自行组织代码验证一下。

public class Test {
    public static void main(String args[]) {
        int a = 60;
        int b = 13;
        System.out.println("a & b = " + (a & b));
        System.out.println("a | b = " + (a | b));
        System.out.println("a ^ b = " + (a ^ b));
        System.out.println("~a = " + (~a));
        System.out.println("a << 2 = " + (a << 2));
        System.out.println("a >> 2 = " + (a >> 2));
        System.out.println("a >>> 2 = " + (a >>> 2));
    }
}

运行结果:

技术分享图片

3 逻辑运算符

逻辑运算符是通过运算符将操作数或等式进行逻辑判断的语句。

表格中的例子中,假设布尔变量a为真,变量b为假:

逻辑运算符名称描述类型举例
&& 当且仅当两个操作数都为真,条件才为真 双目运算符 (a && b)为假
|| 两个操作数任何一个为真,条件为真 双目运算符 (a || b)为真
用来反转操作数的逻辑状态。如果条件为真,则逻辑非运算符将得到假 单目运算符 (!a)为假
^ 异或 如果两个操作数逻辑相同,则结果为假,否则为真 双目运算符 (a ^ b)为真

我们可以通过“举手表决”来理解逻辑运算符

  • &&a同意了(值为true),c也同意了(值为true),那这件事情肯定就Ok了,所以 a && c就为ture;但是其中有一个人不同意,这件事情不行,也就是ac中,有一个为falsea && c就为false

  • ||:这件事情只要有一个人同意了,就可以了。所以ac中,有一个为truea || c就为true

  • !:某个人原本同意,但非运算使他的结果变为相反的。atrue!a就是falseafalse!a就是true

  • 异或^:两个人的表决结果相同,就不通过;表决结果不同,才通过。所以ac中,一真一假结果为真,其他的都是假。

其中,当使用与逻辑运算符时,在两个操作数都为true时,结果才为true,但是当得到第一个操作为false时,其结果就必定是false,这时候就不会再判断第二个操作了。

接下来输入以下代码,进行验证吧,同学们也可自行组织代码验证一下。

public class Test {
    public static void main(String args[]) {
        boolean a = true;
        boolean b = false;
        System.out.println("a && b = " + (a && b));
        System.out.println("a || b = " + (a || b));
        System.out.println("!a = " + (!a));
        System.out.println("a ^ b = " + (a ^ b));
    }
}

运行结果:

技术分享图片

4 赋值运算符

赋值运算符是指将右边的操作数或运算结果赋值给左边的操作数。

赋值运算符名称描述类型举例
= 赋值 右操作数的值赋给左侧操作数 双目运算符 a = c
+= 加等于 左操作数和右操作数相加赋值给左操作数 双目运算符 a += c等价于a = a + c
-= 减等于 左操作数和右操作数相减赋值给左操作数 双目运算符 a -= c等价于a = a - c
*= 乘等于 左操作数和右操作数相乘赋值给左操作数 双目运算符 a *= c等价于a = a * c
/= 除等于 左操作数和右操作数相除赋值给左操作数 双目运算符 a /= c等价于a = a / c
%= 取余等于 左操作数和右操作数取模后赋值给左操作数 双目运算符 a %= c等价于a = a % c

注意:除了上述的赋值运算符外,还有位运算和逻辑运算的赋值运算符,形式和方法同上。

接下来输入以下代码,进行验证吧,同学们也可自行组织代码验证一下。

public class Test {
    public static void main(String args[]) {
        int a = 5;
        int b = 3;
        b += a;
        System.out.println("b += a  = " + b);
        b = 3;
        b -= a;
        System.out.println("b -= a = " + b);
        b = 3;
        b *= a;
        System.out.println("b *= a = " + b);
        b = 3;
        b /= a;
        System.out.println("b /= a = " + b);
        b = 3;
        b %= a;
        System.out.println("b %= a  = " + b);
    }
}

运行结果:

技术分享图片

5 关系运算符

关系运算符生成的是一个boolean(布尔)结果,它们计算的是操作数的值之间的关系。如果关系是真实的,结果为true(真),否则,结果为false(假)。

表格中的例子中,假设变量a为3,变量b为5:

比较运算符名称描述举例
== 等于 判断两个操作数的值是否相等,如果相等则条件为真 (a == b)为false
!= 不等于 判断两个操作数的值是否相等,如果值不相等则条件为真 (a != b) 为true
> 大于 判断左操作数的值是否大于右操作数的值,如果是那么条件为真 (a > b)为false
< 小于 判断左操作数的值是否小于右操作数的值,如果是那么条件为真 (a < b)为true
>= 大于等于 判断左操作数的值是否大于或等于右操作数的值,如果是那么条件为真 (a >= b)为false
<= 小于等于 判断左操作数的值是否小于或等于右操作数的值,如果是那么条件为真 (a <= b)为true

接下来输入以下代码,进行验证吧,同学们也可自行组织代码验证一下。

public class Test {

    public static void main(String args[]) {
        int a = 3;
        int b = 5;
        System.out.println("a == b = " + (a == b));
        System.out.println("a != b = " + (a != b));
        System.out.println("a > b = " + (a > b));
        System.out.println("a < b = " + (a < b));
        System.out.println("a >= b = " + (a >= b));
        System.out.println("a <= b = " + (a <= b));
    }
}

运行结果:

技术分享图片

强调

  • ==!=适用于所有的基本数据类型,其他关系运算符不适用于boolean,因为boolean值只有truefalse,比较没有任何意义。

  • ==!=也适用于所有对象,可以比较对象的引用是否相同。

引用:Java 中一切都是对象,但操作的标识符实际是对象的一个引用。

例:

String s;

在这里,创建的是引用,不是对象。创建引用后,一种安全的做法是对其进行初始化。

String s = "abc";
String s =  new String("abc");

通常采用new操作符生成一个新对象,然后将引用与该对象相关联。

来看下面的代码:

public class Test {

    public static void main(String args[]) {
        Integer n1 = new Integer(2);
        Integer n2 = new Integer(2);
        System.out.println(n1 == n2);
        System.out.println(n1 != n2);
    }
}

在上面的代码中,同学们认为输出的结果是什么呢,可能认为先是true再是false,因为两个对象是相同的。尽管两个对象的内容相同,但它们的引用却不相同,==!=比较的就是对象的引用,所以结果false再是true,如下:

技术分享图片

而想要比较对象的内容是否相同时,Java 提供了一个特殊的方法equals(),它不适用于基本类型基本类型使用==和!=进行比较。

来看下面的代码:

public class Test {

    public static void main(String args[]) {
        Integer n1 = new Integer(2);
        Integer n2 = new Integer(2);
        System.out.println(n1.equals(n2));
    }
}

上述的代码运行结果:

技术分享图片

注:但是当自己创建了一个类时,情况又会相反,因为equals()默认比较引用,除非在自己的类中覆盖equal()方法,这些知识将在之后的章节进行详细讲解。

6 条件运算符

同学们从上面我们可以发现,我们把各类运算符分为了单目运算符和双目运算符,这是什么意思呢?单目运算符(或一元运算符)是只需要有一个操作数的运算符,双目运算符(或二元运算符)是需要两个操作数的运算符。

那有没有三目运算符呢?

条件运算符?:便是唯一的一个三目运算符了。

语法形式:布尔表达式?表达式1 : 表达式2

运算过程:如果布尔表达式的值为true ,则返回 表达式1 的值,否则返回 表达式2 的值。

例如:

String str = (3<2) ? "3小于2" : "3大于2";

System.out.println(str);


  分析一下上面的代码,很明显3<2false,所以返回第二个表达式,即str = "3大于2"

练习一下吧:

如果成绩大于或等于60 ,在控制台上输出及格,反之输出不及格,成绩用 score 表示,它的值定为68.9。

我们来分析一下首先我们得创建一个项目和源代码文件(当然你也可以先创一个包,再创建源代码文件),然后输入我们的固定结构(类和主函数)。

其次我们要定义一个变量 score,因为它的值为68.9,所以我们定义为 double。

然后我们利用条件表达式进行判断,最后再输出到控制台。

参考代码如下:

  

public class Test{
    public static void main(String[] args) {
        double score = 68.9;
        String str = (score >= 60) ? "及格" : "不及格";
        System.out.println("考试成绩:"+str);
    }
}

运算符的优先级

运算符的优先级是帮助我们在一个表达式中如何对于不同的运算符和相同的运算符,进行正确的运算顺序。

运算符的优先级大家在日常生活中通过多多运用自然就熟悉了,不需要特别地去记忆它,下面是木木多年的总结,有些运算符大家可能还不认识,先熟悉一下就行了。

!技术分享图片

技术分享图片

以上是关于Java运算符的主要内容,如果未能解决你的问题,请参考以下文章

10个JavaScript代码片段,使你更加容易前端开发。

Java基础知识 自增自减运算符

20个简洁的 JS 代码片段

20个简洁的 JS 代码片段

java代码在片段活动中不起作用

java 代码片段【JAVA】