读Java编程思想随笔の操作符
赋值
赋值使用操作符“=”。它的意思是“取右边的值(右值)把它赋值给左边(左值)”。右值可以使任何常数,常量或者表达式。但左值必须是一个明确的、已命名的对象。也就是说,必须有一个物理空间可以存储等号右边的值。举例来说,可以将一个常数赋给一个变量:
a = 4;
但是不能把任何东西赋值给一个常数,常数不能作为左值(比如不能说4 = a;)。
对基本数据类型的赋值是很简单的。基本类型存储了实际的数值,而并非指向一个对象的引用,所以在为其赋值的时候,是直接将一个地方的内容复制到另一个地方。例如,对基本数据类型使用a=b,那么b的内容就复制给a。若接着又修改了a,而b根本不会受这种修改的影响。
但是在为对象赋值的时候,情况却发生了变化,对一个对象进行操作时,我们真正操作的是对对象的引用。所以倘若将一个对象赋值给另一个对象,实际上是将引用从一个地方复制到另一个地方。这意味假若对对象使用c=d,那么c和d都指向原本只有d指向的那个对象。
关系操作符
测试对象的等价性
先看一个示例:
public class Equivalence { public static void main(String[] args) { // TODO Auto-generated method stub Integer x = new Integer(1); Integer y = new Integer(2); System.out.println(x == y);//false System.out.println(x != y);//true } }
!!! "=="和"!="比较的是对象的引用。
如果想比较两个对象的实际内容是否相同,又该如何操作?此时,必须使用所有对象都适用的特殊方法equals()。但这个方法不适合基本类型,基本类型使用"=="和"!="即可。
再看一个示例:
public class Equivalence { // public static void main(String[] args) { // // TODO Auto-generated method stub // Integer x = new Integer(1); // Integer y = new Integer(2); // System.out.println(x == y);//false // System.out.println(x != y);//true // } int i; public static void main(String[] args) { Equivalence e1 = new Equivalence(); Equivalence e2 = new Equivalence(); e1.i = e2.i = 100; System.out.println(e1.equals(e2));//false } }
逻辑操作符短路
当使用逻辑操作符时,我们会遇到一种短路的现象。即一旦能明确无误的确定整个表达式的值,就不再计算表达式余下部分。因此,整个表达式靠后的部分可能不再被计算。事实上,如果所有逻辑表达式都有一部分不必计算,那将获得潜在的性能提升。
按位操作符
按位操作符用来操作整数基本数据类型中单个bit,即二进制位。按位操作符会对两个参数中对应的位执行布尔代数运算,并最终生成一个结果。
如果两个输入位都是1,则按位“与”操作符 (&) 生成一个输出位1;否则生成一个输出位0。如果两个输入位里只要有一个是1,则按位 “或” 操作符 (|)生成一个输出位1;只有在两个输入位都为0的情况下,它才会生成一个输出位0.如果输入位某一个是1,但不全是1,那么按位“异或”操作(ˆ)生成一个输出位1。按位“非”(~),也称为取反操作符,它属于一元操作符,只对一个操作数进行操作(其他按位操作符是二元操作符)。按位“非”生成与输入位相反的值--若输入0,则输出1;若输入1,则输出0。
逻辑运算符
移位操作符操作的运算对象也是二进制的“位”。移位操作符只可用来处理整数类型。左移位操作符(<<)能按照操作符右侧指定的位数将操作符左边的操作数向左移动(低位补0)。“有符号”右移操作符(>>)则按照操作符右侧指定的位数将操作符左边的操作数向右移动。“有符号”右移位操作符使用“符号扩展”;若符号为正,则在高位插入0,若符号为负,则在高位插入1。Java中增加了一种右移位无符号的操作符(>>>),它使用“零扩展”;无论正负,都在高位插入0。
如果对char\byte\short类型的数值进行移位处理,那么在移位进行之前,它们会被转换为int类型,并且得到的结果也是一个int类型的值,只有数值右端的低五位才可以用。这样可以防止我们移位超过int型所具有的位数。(2的5次方为32)。若对一个long类型的数进行处理,最后得到的结果也是long,此时,只会用到数值右端的低六位,以防止移位超过long型数据所具有的位数。