操作符

Java操作符

操作符作用于操作数,它接受一个或多个参数,并生成一个新值。参数的形式与普通的方法调用不同,但效果是相同的。有些操作符可能会改变操作数自身的值,这被称为“副作用”。那些能改变其操作数的操作符,最普遍的用途就是用来产生副作用,但要记住使用此类操作符生成的值与使用没有副作用的操作符生成的值,没有什么区别。

赋值

int a = 1;

赋值使用操作符“=”。它的意思是“取右边的值(即右值),把它复制给左边(即左值)”。右值可以是任何常数、变量或者表达式(只要它能生成一个值就行)。但左值必须是一个明确的、已命名的变量。但是不能把任何东西赋给常数,常数不能作为左值(例如:4 = a)

算数操作符

Java的基本算术操作符与其他大多数程序设计语言是相同的。其中包括加号(+)、减号(-)除号(/)、乘号(*)以及取模操作符(%,它从整数除法中产生余数)整数除法会直接去掉结果的小数位,而不是四舍五入地圆整结果。
Java也使用一种来自C和C++的简化符号同时进行运算与赋值操作。这用操作符后紧跟一个等号来表示,它对于Java中的所有操作符都适用,只要其有实际意义就行。例如,要将x加4并将结果赋回给x,可以这么写:x+= 4。

int i = 1;
int j = 10;
int k = 10;
i = j + k;//加 i = 20
i = j - k;//减 i = 0
i = j * k;//乘 i = 100
i = j / k;//除 i = 1
i = j % k;//取模 i = 0
i += j;   //加等于 i = 11

关系操作符

关系操作符生成的是一个 boolean(布尔)结果,它们计算的是操作数的值之间的关系。如果关系是真实的,关系表达式会生成true(真);如果关系不真实,则生成false(假)。关系操作符包括小于(<)、大于(>)、小于或等于(<=)、大于或等于(>=)、等于(==)以及不等于(!=)。等于和不等于适用于所有的基本数据类型,而其他比较符不适用于 boolean类型,因为boolean值只能为true或 false。
基本类型使用==和!=即可直接比较直,而对于对象来说==和!=比较的是它们的引用,此时必须使用所有对象都适用的特殊方法equals()。equals()的默认行为是比较引用,所以除非在自己的新类中覆方法equals()方法,否则不可能表现出我们希望的行为。
基本类型比较:

int j = 1;
int k = 2;
j < k;//返回true
j > k;//返回false
j == k;//返回false
j != k;//返回true

对象比较:

//封装类型
Integer i1 = new Integer(1);
Integer i2 = new Integer(1);
System.out.println(i1 == i2);      //输出false,对象比较的是当前对象的引用
System.out.println(i1.equals(i2)); //输出true,封装类型重写了equals()方法

//自定义类(未重写equals方法)
class Value{
	int i = 10;
}
Value v1 = new Value();
Value v2 = new Value();
System.out.println(v1.equals(v2)); //返回false,equals()方法默认比较对象的引用

//自定义类(重写equals方法)
class Value{
	int i = 10;
	
	@Override
	public boolean equals(Object obj) {
		return i == ((Value)obj).i;
	}
}
Value v1 = new Value();
Value v2 = new Value();
System.out.println(v1.equals(v2)); //返回true

逻辑操作符

逻辑操作符“与”(&&)、“或”(||)、“非”(!)能根据参数的逻辑关系,生成布尔值(true或false)。逻辑操作符只可应用于布尔值。注意,如果在应该使用 String值的地方使用了布尔值,布尔值会自动转换成适当的文本形式

int j = 10;
int k = 20;
System.out.println((j < 20) && (k <20)); //输出false,左右两边都为true结果才为true
System.out.println((j < 20) || (k <20)); //输出true,左右两边只要有一个为true,结果就为true
System.out.println(!(j < 20)); //输出false,结果取反

按位操作符

按位操作符用来操作整数基本数据类型中的单个“比特”(bit),即二进制位。按位操作符会对两个参数中对应的位执行布尔代数运算,并最终生成一个值。
如果两个输入位都是1,则按位“与”操作符(&)生成一个输出位1,否则生成一个输出位0;如果两个输入位里只要有一个是1,则按位“或”操作符(|)生成一个输出位1,只有在两个输入位都是0的情况下,它才会生成一个输出位0;如果输入位的某一个是1,但不全都是1,那么按位“异或”操作(^)生成一个输出位1。按位“非”(~),也称为取反操作符,它属于一元操作符,只对一个操作数进行操作(其他按位操作符是二元操作符)。按位“非”生成与输入位相反的值——若输入0,则输出1,若输入1,则输出0。

  1. 按位与运算符(&)
    1.1、运算规则:两位同时为“1”,结果才为“1”,否则为0
    即:0&0=0; 0&1=0; 1&0=0; 1&1=1;
    例如:3&5 即 0000 0011 & 0000 0101 = 0000 0001 因此,3&5的值得1。
    另,负数按补码形式参加按位与运算。
    1.2、“与运算”的特殊用途:
    (1)清零。如果想将一个单元清零,即使其全部二进制位为0,只要与一个各位都为零的数值相与,结果为零。
    (2)取一个数中的指定位
    方法:找一个数,对应X要取的位,该数的对应位为1,其余位为零,此数与X进行“与运算”可以得到X中的指定位。
    例:设X=10101110,取X的低4位,用 X & 0000 1111 = 0000 1110 即可得到;
  2. 按位或运算符(|)
    2.1、运算规则:参加运算的两个对象只要有一个为1,其值为1。
    即 :0|0=0; 0|1=1; 1|0=1; 1|1=1。
    例如:3|5 即 0000 0011 | 0000 0101 = 0000 0111 因此,3|5的值得7。
    另,负数按补码形式参加按位或运算。
    2.2、“或运算”特殊作用:
    (1)常用来对一个数据的某些位置1。
    方法:找到一个数,对应X要置1的位,该数的对应位为1,其余位为零。此数与X相或可使X中的某些位置1。
    例:将X=10100000的低4位置1 ,用 X | 0000 1111 = 1010 1111即可得到。
  3. 异或运算符(^)
    3.1、运算规则:两个相应位为“异”(值不同),则该位结果为1,否则为0。
    即:0^0=0; 0^1=1; 1^0=1; 1^1=0。
    3.2、“异或运算”的特殊作用:
    (1)使特定位翻转找一个数,对应X要翻转的各位,该数的对应位为1,其余位为零,此数与X对应位异或即可。
    例:X=10101110,使X低4位翻转,用X ^ 0000 1111 = 1010 0001即可得到。
    (2)与0相异或,保留原值 ,X ^ 0000 0000 = 1010 1110。
  4. 取反运算符(~)
    4.1、运输规则:对一个二进制数按位取反,即将0变1,1变0。
    即:~1=0; ~0=1;
    另:使一个数的最低位为零,可以表示为:a&~1。~1的值为1111111111111110,再按“与”运算,最低位一定为0。因为“~”运算符的优先级比算术运算符、关系运算符、逻辑运算符和其他运算符都高。

移位操作符

移位操作符操作的运算对象也是二进制的“位”。移位操作符只可用来处理整数类型(基本类型的一种)。左移位操作符(<<)能按照操作符右侧指定的位数将操作符左边的操作数向左移动(在低位补0)。“有符号”右移位操作符(>>)则按照操作符右侧指定的位数将操作符左边的操作数向右移动。“有符号”右移位操作符使用“符号扩展”:若符号为正,则在高位插人0,若符号为负,则在髙位插入1。 Java中增加了一种“无符号”右移位操作符(>>>),它使用“零扩展”:无论正负,都在高位插入0。

如果对char、byte或者short类型的数值进行移位处理,那么在移位进行之前,它们会被转换为int类型,并且得到的结果也是一个int类型的值。只有数值右端的低5位才有用。这样可防止我们移位超过int型值所具有的位数。(因为2的5次方为32,而int型值只有32位)若对一个long类型的数值进行处理,最后得到的结果也是long。此时只会用到数值右端的低6位,以防止移位超过long型数值具有的位数。

“移位”可与“等号”(<<=或>>=或>>>=)组合使用。此时,操作符左边的值会移动由右边的值指定的位数,再将得到的结果赋给左边的变量。但在进行“无符号”右移位结合赋值操作时,可能会遇到一个问题:如果对byte或short值进行这样的移位运算,得到的可能不是正确的结果。它们会先被转换成int类型,再进行右移操作,然后被截断,赋值给原来的类型,在这种情况下可能得到-1的结果。

  1. 左移运算符(<<)
    1.1、运算规则:将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0),若左移时舍弃的高位不包含1,则每左移一位,相当于该数乘以2。
    例如:a = a << 2 将a的二进制位左移2位,左移2位后a = a * 2 * 2;
  2. 右移运算符(>>)
    1.1、运算规则:将一个数的各二进制位全部右移若干位,移数为正数左补0,移数为负数左补1,右边丢弃,操作数每右移一位,相当于该数除以2。
    例如:a = a >> 2 将a的二进制位右移2位,右移2位后a = a / 2 / 2。
  3. 无符号右移(>>>)
    3.1、运算规则:将一个数的各二进制位全部右移若干位,无论正负都在高位插入0。

三元操作符

三元操作符也称为条件操作符,它显得比较特别,因为它有三个操作数,但它确实属于操作符的一种,因为它最终也会生成一个值,这与普通的if-else语句是不同的。
其表达式采取下述形式:
boolean-exp ? value0 : value1
如果boolean-exp (布尔表达式)的结果为true,就计算 value0,而且这个计算结果也就是操作符最终产生的值。如果boolean-exp的结果为false,就计算value1,同样它的结果也就成为了操作符最终产生的值。
当然,也可以换用普通的if-eke语句,但三元操作符更加简洁。三元操作符的引入多半就是为了体现这种高效率的编程,但假如你打算频繁使用它,还是要多作思量,因为它很容易产生可读性极差的代码。

public class Test {
	
	public static void main(String[] args) {
		int i = 1;
		String str = i == 1 ? "它是1":"它不是1";
		System.out.println(str);	//输出:它是1
	}
}

自动递增和递减

递增和递减运算是两种相当快捷运算(常称为“自动递动递增”和“自动递动递减”运算)其中,递减操作符是“–”意为“减少一个单位”,递增操作符是“++”意为“增加一个单位。递增和递减操作符不仅改变了变量,并且以变量的值作为生成的结果。
这两个操作符各有两种使用方式,通常称为“前缀式”和“后缀式”。“前缀递增”表示“++”操作符位于变量或表达式的前面;而“后缀递增”表示“++”操作符位于变量或表达式的后面,递减亦是如此。对于前缀递增和前缀递减(如++a或–a),会先执行运算,再生成值。而对于后缀递增和后缀递减(如a++或a–),会先生成值,再执行运算。

int i = 1;
i ++;// i = 1 当前为1,等后续操作时才会变成2
++ i;// i = 2 当前为2
i --;// i = 1 当前为1,与i ++同理
-- i;// i = 0 当前为0,与 --i同理

字符串操作符+和+=

这个操作符在Java中有一项特殊用途:连接不同的字符串。这里引入了操作符重栽 (operator overloading)机制。字符串操作符有一些很有趣的行为,如果表达式以一个字符串起头,那么后续所有操作数都必须是字符串型(请记住,编译器会把双引号内的字符序列自动转成字符串)

public class Test {
	
	public static void main(String[] args) {
		int j = 1;
		int k = 2;
		String str = "3";
		System.out.println(str+k+j);//输出:321
	}
}

短路

当使用逻辑操作符时,我们会遇到一种“短路”现象,即一旦能够明确无误地确定整个表达式的值,就不再计算表达式余下部分了。因此,整个逻辑表达式靠后的部分有可能不会被运算(潜在的性能提升)。例如:

public class Test{
	
	public static boolean test(int i){
		return 10 < i;
	}
	
	public static void main(String[] args) {
		boolean b = test(1) && test(2) && test(10);
		System.out.println(b);//输出false,后面的test(2)与test(10)都不会执行
	}
}

优先级

当一个表达式中存在多个操作符时,作符的优先级就决定了各部分的计算顺序。Java对计算顺序做了特别规定。其中,最简单的规则就是先乘除后加减。程序员经常忘记优先级规则,所以应该用括号明确规定计算顺序。
优先级表:
在这里插入图片描述


  1. 本文来源《Java编程思想(第四版)》
  2. 按位、移位操作符参考原文:https://wenwen.sogou.com/z/q661699307.htm
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值