读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型数据所具有的位数。

  

  

  

posted @ 2015-10-25 09:29  有志竟成  阅读(157)  评论(0)    收藏  举报