IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    [原]一些Java运算符的细节

    lincyang发表于 2013-03-27 20:15:19
    love 0

    一、m+=n与m=m+n的异同

    一般情况下这两者是相同的,但下面的例子中就有了差别。

    public class Test
    {
    	public static void main(String[] args)
    	{
    		short width = 10;
    		width += 2;//ok
    		System.out.println(width);
    
    		width = width + 1;//error,范围大的类型转为范围小的类型会有损失精度,要进行强制转换
    		System.out.println(width);
    	}
    }
    
    这样会报错:

    D:\workspace\Java\project261\+=>javac Test.java
    Test.java:9: 可能损失精度
    找到: int
    需要: short
                    width = width + 1;
                                  ^
    1 错误
    
    原因就是+=操作符会自动根据变量的类型进行强制类型转换,而这是二者的根本区别。

    二、&和&&的区别

    如果用过C++的童鞋会很自然的使用&&运算符,这被称为是短路与。如果第一个条件为假,那么不去执行第二个条件,直接返回结果假。这有两个好处,一个是效率比&符要高,另一个好处是第二个条件可以是个危险的操作,而第一个条件不过,那么直接返回了,不会执行这个危险的操作,比如对象为null等。

    三、+运算符是在字符串操作时的神奇作用

    1、String string  = "" + 123;//原理同第一条,123不用我们做强制转换,直接被+完成了。在项目中经常会看到这样的代码。我们很懒么?

    2、String tmp1 = “I lo”;

           String tmp2 = "ve you";

          String string = tmp1 + tmp2;

           内部原理是编译器采用了StringBuilder类的append方法来做此操作。详情参见Java中何时用String,何时用StringBuilder。

    三、老调重弹,==与equals()

    ==是关系运算符,比较的是基本类型变量的值或者是引用类型变量所引用的地址。

    equals()方法是Object类的方法,比较的是引用类型变量指向的存储内容。

    不要用混了。

    四、String构造的两种方法

    1、String string = new String("I love you");

    2、String string = "I love you";

    String 类型提供了一个被称为缓冲区的机制(概念),当用第二种方法构造字符串时,编译器(运行时?)会去缓冲区中查找相同内容的字符串,如果有了就不用再创建一个新的了,如果没有就创建一个放到缓冲区中。提高了效率。而第一种方法,每次都要构造一个新的字符串。相比之下,还是用第二种方法比较好。




沪ICP备19023445号-2号
友情链接