Java 运算符

一、运算符基本概念

相关术语

运算符:运算符是对一个、两个或三个操作数执行特定操作,然后返回结果的特殊符号。

操作数:操作数也称为运算对象,它既可以是常量、变量,也可以是函数。

优先级:通过运算符优先级来解决操作顺序的问题。每个运算符都有自己的优先级。

结合性:运算的顺序。大多数运算符都是按从左到右的顺序进行。

运算符的分类

按照操作数的个数划分,可以分为一元运算符、二元运算符和三元运算符。

按照运算功能划分,可以划分为算数运算符、关系运算符、逻辑运算符、位运算符、赋值运算符、条件运算符和对象运算符。

二、算数运算符

2.1 加减乘除取模

Java编程语言提供了执行加减乘除的运算符。

运算符描述
+加法 - 相加运算符两侧的值
-减法 - 左操作数减去右操作数
*乘法 - 相乘操作符两侧的值
/除法 - 左操作数除以右操作数
%

取模(取余) - 左操作数除以右操作数的余数

示例:

int result;
result = 1 + 2;
System.out.println("1 + 2 = " + result);

result = result - 1;
System.out.println("3 - 1 = " + result);

result = result * 2;
System.out.println("2 * 2 = " + result);

result = result / 2;
System.out.println("4 / 2 = " + result);

result = 10 % 7;
System.out.println("10 % 7 = " + result);

输出:

1 + 2 = 3
3 - 1 = 2
2 * 2 = 4
4 / 2 = 2
10 % 7 = 3

在取模运算中,运算结果与第一个操作数的符号是相同的。

示例:

int result;
result = 10 % 7;
System.out.println("10 % 7 = " + result);

result = -10 % 7;
System.out.println("-10 % 7 = " + result);

result = 10 % -7;
System.out.println("10 % -7 = " + result);

result = -10 % -7;
System.out.println("-10 % -7 = " + result);

 输出:

10 % 7 = 3
-10 % 7 = -3
10 % -7 = 3
-10 % -7 = -3

 2.2 “+”和“-”用作一元运算符

运算符描述
+表示正值(可以省略)
-

表示负值

2.3 “+”用作二元运算符,操作数中有字符串

“+”用作二元运算符,操作数中有字符串时表示字符串拼接符。

示例:

String firstString = "This is";
String secondString = " a concatenated string.";
String thirdString = firstString+secondString;
System.out.println(thirdString);

输出:

This is a concatenated string.

2.4 “++”(自增)和“--”自减

运算符描述
++自增:操作数的值增加1
--自减:操作数的值减少1

示例:

int a = 10;
a++;
System.out.println("a = " + a);
a--;
System.out.println("a = " + a);

int b = 10;
++b;
System.out.println("b = " + b);
--b;
System.out.println("b = " + b);

输出:

a = 11
a = 10
b = 11
b = 10

1. 要求操作数必须是变量。

2. 自增和自减运算包含前置运算和后置运算两种变化:

    a)前置运算符需要把运算符放置在操作数前,规则是先运算,再使用操作数变量值。

    b)后置运算符需要把运算符放置在操作数后,规则是先使用操作数变量值,再进行自增或自减运算。

示例:

int i = 3;
i++;
// prints 4
System.out.println(i);
++i;			   
// prints 5
System.out.println(i);
// prints 6
System.out.println(++i);
// prints 6
System.out.println(i++);
// prints 7
System.out.println(i);

三、关系运算符

关系运算符决定一个操作数是否大于、小于、等于或不等于另一个操作数。

运算符描述
==表示等于
!=表示不等于
<表示小于
<=表示小于等于
>表示大于
>=表示大于等于

示例:

int value1 = 1;
int value2 = 2;
if(value1 == value2)
    System.out.println("value1 == value2");
if(value1 != value2)
    System.out.println("value1 != value2");
if(value1 > value2)
    System.out.println("value1 > value2");
if(value1 < value2)
    System.out.println("value1 < value2");
if(value1 <= value2)
    System.out.println("value1 <= value2");

输出:

value1 != value2
value1 <  value2
value1 <= value2

<、<=、>、>=只能用来比较基本数据类型(除了boolean型)数值的大小,不能用于比较引用数据类型(如String、array等类型)和boolean型的数据。

==和!=则可以用于基本数据类型和引用数据类型上。

Java语言中==和equals()方法的区别是什么?

当把==用于引用数据类型的对象时,比较的只是两个对象引用是否指向了同一个对象,而不是比较其值。如果想知道两个对象的值是否相等,就需要使用equals()方法。 

 示例:

String str1 = new String("hello");
String str2 = new String("hello");
String str3 = str1;
System.out.println("str1 == str2: " + (str1 == str2));
System.out.println("str1 == str3: " + (str1 == str3));
System.out.println("str1.equals(str2): " + str1.equals(str2));
System.out.println("str1.equals(str3): " + str1.equals(str3));

输出:

str1 == str2: false
str1 == str3: true
str1.equals(str2): true
str1.equals(str3): true

 

四、逻辑运算符 

逻辑运算符也可称为布尔逻辑运算符,共有6种,包括&&(条件与AND)、&(逻辑与AND)、||(条件或OR)、|(逻辑或OR)、!(逻辑非NOT)、^(逻辑异或OR)。逻辑运算的操作数只能时布尔型,逻辑运算的结果也是布尔型。

AB

A&B

A&&B

A|B

A||B

A^B!A
falsefalsefalsefalsefalsetrue
truefalsefalsetruetruefalse
falsetruefalsetruetruetrue
truetruetruetruefalsefalse

&&与&、||与|在运算上具有相同的结果,那么它们的区别究竟在哪里?

&&和||具有“短路规则”。

短路规则指的是在运算中,如果从第一个操作数就可以推导出结果,就会省略掉第二个操作数的计算。

 示例:

int a = 10;
if (a > 0 || a / 0 > 0) {
    System.out.println("a大于0");
} else {
    System.out.println("a小于等于0");
}

输出:

a大于0

解析:

如果条件a > 0 || a / 0 > 0 替换成 a > 0 | a / 0 > 0 就会运行出错。

如果条件a > 0 || a / 0 > 0 替换成 a / 0 > 0 || a > 0 就会运行出错。

五、位运算符

位运算符直接对整数类型的位进行操作,包括byte、short、int、long、char。根据功能可分为位逻辑运算符和移位运算符。

5.1 位逻辑运算符

位逻辑运算符包括&(按位与)、|(按位或)、^(按位异或)、~(按位取反)。

ABA&BA|BA^B~A
000001
100110
010111
111100

&(按位与)运算规则是:如果两个运算数都是1,则结果为1。

|(按位或)运算规则是:任何一个运算数为1,则结果为1。

^(按位异或)运算规则是:只有在两个比较的位不同时其结果时1,否则结果是0。

~(按位取反)是对其运算数的每一位取反。

/*
42
原码 00000000 00000000 00000000 00101010
反码 00000000 00000000 00000000 00101010
补码 00000000 00000000 00000000 00101010
-43
原码 10000000 00000000 00000000 00101011
反码 11111111 11111111 11111111 11010100
补码 11111111 11111111 11111111 11010101
15
原码 00000000 00000000 00000000 00001111
反码 00000000 00000000 00000000 00001111
补码 00000000 00000000 00000000 00001111
42 & -43
00000000 00000000 00000000 00101010
11111111 11111111 11111111 11010101
00000000 00000000 00000000 00000000 补码
42 & 15
00000000 00000000 00000000 00101010
00000000 00000000 00000000 00001111
00000000 00000000 00000000 00001010
 */
System.out.println("42 & -43 = " + (42 & -43));
System.out.println("42 & -43 = " + (42 & 15));

/*
42 | -43
00000000 00000000 00000000 00101010
11111111 11111111 11111111 11010101
11111111 11111111 11111111 11111111 补码
11111111 11111111 11111111 11111110 反码
10000000 00000000 00000000 00000001 原码 值为-1
42 | 15
00000000 00000000 00000000 00101010
00000000 00000000 00000000 00001111
00000000 00000000 00000000 00101111 补码 值为47
 */
System.out.println("42 | -43 = " + (42 | -43));
System.out.println("42 | -43 = " + (42 | 15));

/*
42 ^ -43
00000000 00000000 00000000 00101010
11111111 11111111 11111111 11010101
11111111 11111111 11111111 11111111 补码 值为-1
42 ^ 15
00000000 00000000 00000000 00101010
00000000 00000000 00000000 00001111
00000000 00000000 00000000 00100101 补码 值为37
 */
System.out.println("42 ^ -43 = " + (42 ^ -43));
System.out.println("42 ^ -43 = " + (42 ^ 15));

/*
~42
00000000 00000000 00000000 00101010
11111111 11111111 11111111 11010101 补码 值为-43
 */
System.out.println("~42 = " + (~42));

输出:

42 & -43 = 0
42 & -43 = 10
42 | -43 = -1
42 | -43 = 47
42 ^ -43 = -1
42 ^ -43 = 37
~42 = -43

5.2 移位运算符

移位运算符就是在二进制的基础上对数字进行移位操作,即先将整数写成二进制形式,然后按位操作,最后产生一个新的数。按照平移的方向和填充数字的规则分为三种:<<(左移)、>>(带符号右移)和>>>(无符号右移)。

<<(左移)运算符是将运算符左边的对象向左移动运算符右边指定的位数,舍弃移出的高位,并将右端的低位补0。例如:

// 值为60
15 << 2

计算过程:15的二进制形式是00001111,将位数左移2位,高位的最前面的两个数字被移出,在右端低位补0,则得到的结果是00111100.转换为十进制是60。

>>(带符号右移)是将运算符左边的运算对象向右移动运算符右侧指定的位数。它使用了“符号扩展”机制,也就是说,如果值为正,在高位补0,若为负,则在高位补1。例如:

// 值为8
35 >> 2
// 值为-11
-43 >> 2

计算过程:35的二进制形式为00100011,将位数右移2位,然后把低位的最后两个数字移出,因为该数字是正数,所以在高位补0,则得到的最终结果是0000100。

>>>(无符号右移)同>>(带符号右移)的移动规则是一样的,唯一的区别就是>>>(无符号右移)采用了“零扩展”,也就是说,无论值为正负,都在高位补0。例如:

// 值为2
8 >>> 2

六、赋值类运算符

赋值类运算符包括=、+=、-=、*=、/=、%=、&=、|=、^=、<<=、>>=、>>>=。

赋值运算符(=)表示将右侧的值赋给左侧的操作数。通用格式为 var = expression。例如:

int age = 18;

var代表变量,expression表示表达式,使用赋值运算符则变量的类型必须与表达式的类型一致。另外,赋值表达式允许对一连串变量赋值。例如:

int x,y,z;
x = y = z = 10;

该操作符还可以用于对象,以分配对象引用。

其他赋值类运算符可以认为是相应的运算与赋值运算的结合。

七、条件运算符

条件运算符(?:)是一个三元运算符,即它有三个运算对象。其表达式形式为“op1?op2:op3”,op代表运算对象。op1是一个布尔表达式,如果op1值为true,条件运算结果取op2的值;如果op1值为false,条件运算结果取op3的值。例如:

int a = 10;
init b = ((a > 0) ? 1 : -1);  // 结果为1

 

八、对象运算符

对象运算符有new和instanceof。

new用于创建一个新的对象或数组。

instanceof操作符将对象与指定类型进行比较。您可以使用它来测试一个对象是类的实例、子类的实例还是实现特定接口的类的实例。

示例:

class InstanceofDemo {
    public static void main(String[] args) {

        Parent obj1 = new Parent();
        Parent obj2 = new Child();

        System.out.println("obj1 instanceof Parent: "
            + (obj1 instanceof Parent));
        System.out.println("obj1 instanceof Child: "
            + (obj1 instanceof Child));
        System.out.println("obj1 instanceof MyInterface: "
            + (obj1 instanceof MyInterface));
        System.out.println("obj2 instanceof Parent: "
            + (obj2 instanceof Parent));
        System.out.println("obj2 instanceof Child: "
            + (obj2 instanceof Child));
        System.out.println("obj2 instanceof MyInterface: "
            + (obj2 instanceof MyInterface));
    }
}

class Parent {}
class Child extends Parent implements MyInterface {}
interface MyInterface {}

输出:

obj1 instanceof Parent: true
obj1 instanceof Child: false
obj1 instanceof MyInterface: false
obj2 instanceof Parent: true
obj2 instanceof Child: true
obj2 instanceof MyInterface: true

在使用instanceof操作符时,请记住null不是任何东西的实例。

 

九、其他运算符

其他运算符包括“(类型)”、“.”、[]、()。 

(类型)用来进行强制类型转换。例如:

long c = 100;
int b = (int)c;

运算符“.”用来访问对象实例或者类的字段或者方法。

运算符()优先级是所有运算符中最高的,它可以改变表达式运算的先后顺序。在有些情况下,它可以表示方法的调用。

运算符[]用来作为数组运算符。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值