zoukankan      html  css  js  c++  java
  • 【JAVA】【基础语法】Java中操作运算符的细节

    参考:https://blog.csdn.net/dengxingbo/article/details/5128946

    一、等于(==)

    1. 如果 == 运算符的两个操作数相等,计算结果为 true;否则计算结果为 false。
    • 如果操作数是基本类型,这个运算符测试两个操作数的值是否一样。
    • 如果操作数是引用类型,这个运算符测试两个操作数是否指向同一个对象或数组
    • 尤其要注意,这个运算符不能测试两个字符串是否相等
    1. 如果使用 == 比较两个数字或字符,而且两个操作数的类型不同,在比较之前会把取值范围窄的操作数转换成取值范围宽的操作数类型。
      例如,比较short 类型的值和float 类型的值时,在比较之前会先把 short 类型的值转换成 float 类型。对浮点数来说:
    • 特殊的负零和普通的正零相等;
    • 特殊的NaN和任何数,包括NaN自己,都不相等。如果想测试浮点数是否为NaN,要使用Float.isNan() 或 Double.isNan() 方法。
      看一段如下样例代码:
      int a1 = 1000;
      int a2 = 1000;
      System.out.println(a1 == a2); // true
    
      Integer b1 = 1;
      Integer b2 = 1;
      System.out.println(b1 == b2); // true
    
      Integer c1 = 128;
      Integer c2 = 128;
      System.out.println(c1 == c2); // false
    
      Integer d1 = new Integer(1);
      Integer d2 = new Integer(1);
      System.out.println(d1 == d2); // false
      System.out.println(d1.equals(d2)); // true
    

    第一段,a1和a2是基本数据类型,采用==比较的是值是否相等,所以返回结果是True。

    第二段~第四段比较的是对象类型,为什么结果不一致呢?
    Java中对Integer类型对象 采用 int类型字段赋值,实际采用的是vauleOf()方法。
    Integer.class中valueOf方法定义如下:

        public static Integer valueOf(int i) {
          final int offset = 128;
          if (i >= -128 && i <= 127) { // must cache
            return IntegerCache.cache[i + offset];
          }
          return new Integer(i);
        }
    

      IntegerCache.class中定义如下: 

        static final Integer cache[] = new Integer[-(-128) + 127 + 1];
    
        static {
          for(int i = 0; i < cache.length; i++)
            cache[i] = new Integer(i - 128);
          }
      }
    

    通过如上方法可以看出,JDK编译器在程序运行时就把 -128~127 范围的数字预编译放进缓冲区。所以如上:
    (1)b1 和 b2引用对象赋值,采用的是valueOf()方式,由于值<127,实际引用的是IntegerCache中的同一对象。所以比较为true。
    (2)c1 和 c2引用对象赋值,采用的是valueOf()方式,由于值>127,实际会分别通过new操作创建新的对象。所以
    比较为true。
    (3)d1 和 d2引用对象直接采用new操作创建新的对象。所以==比较为true。

    二、不等于(!=)

    不等于(!=) != 运算符完全是 == 运算符的反运算。如果两个基本类型操作数的值不同,或者两个引用类型操作数指向不同的对象或数组,!= 运算符的计算结果为 true;否则,计算结果 为 false。

    三、关系运算符(< <= > >=)

    关系运算符可用于数字和字符,但不能用于布尔值、对象和数组,因为这些类型无序
      • 小于(<) 如果第一个操作数小于第二个操作数,计算结果为 true。
      • 小于或等于(<=) 如果第一个操作数小于或等于第二个操作数,计算结果为 true。
      • 大于(>) 如果第一个操作数大于第二个操作数,计算结果为 true。
      • 大于或等于(>=) 如果第一个操作数大于或等于第二个操作数,计算结果为 true。

  • 相关阅读:
    代码之美
    一点对互联网的浅薄理解
    angularjs填写表单
    一种通用数据采集的schema定义形式
    maven常用命令
    find which process occupy the PORT
    Mac上安装boost开放环境
    codeforces 581B Luxurious Houses
    codeforces 599A Patrick and Shopping
    codeforces 597A Divisibility
  • 原文地址:https://www.cnblogs.com/yickel/p/14594945.html
Copyright © 2011-2022 走看看