zoukankan      html  css  js  c++  java
  • Long类型比较不能直接用等于

    在判断两个Long型数据是否相等的时候遇到了一个问题。

    使用“==”的疑问

    if (user.getId() == admin.getId()) {  
        return true; 
    } else {
        return false;
    }

    两个Long型的ID之间的比较,结果却是false。
    再看一个

    Long id1 = 123L;  
    Long id2 = 123L;
    
    System.out.println(id1 == id2);
    
    输出: true

    同是Long型,同是==,为什么结果不一样呢?
    看看源代码:

    private static class LongCache {  
      private LongCache(){}
      static final Long cache[] = new Long[-(-128) + 127 + 1];
      static {
        for(int i = 0; i < cache.length; i++)
          cache[i] = new Long(i - 128);
      }
    }
    public static Long valueOf(long l) {  
      final int offset = 128;
      if (l >= -128 && l <= 127) { // will cache
        return LongCache.cache[(int)l + offset];
      }
      return new Long(l);
    }

    原来是因为Long中有一个静态的内部类LongCache,专门用于缓存-128至127之间的值,一共256个元素。
    如果仅仅是缓存下来而不去使用那么就没有任何意义。valueOf(long l)就是使缓存派上用场的方法,它会判断传入的参数是否在-128-127之间,如果是则直接从缓存中返回对应的引用,否则新创建一个Long的实例。

    使用equals

    Long重写了equals方法,如下:

    public boolean equals(Object obj) {  
      if (obj instanceof Long) {
          return value == ((Long)obj).longValue();
      }
      return false;
      }

    它是先通过.longValue()方法获取Long对象的基本类型long的值之后再做比较的。

    但是我们用longValue比较时容易忘记后面一个包装类调longValue方法
    所以,最好还是使用equals进行比较。也可以直接用.longValue()比较

  • 相关阅读:
    Hibernate 多表查询结果集的处理
    is not mapped [from错误
    input输入框内,焦点后文字消失;placeholder 与 value 区别
    滚动文字JS
    安装mysql和xampp遇到问题
    python数据结构总结
    翻译二--创建一个Web测试计划
    jmeter元件执行顺序及简介
    testlink for windows 安装
    postman使用
  • 原文地址:https://www.cnblogs.com/flywang/p/7804398.html
Copyright © 2011-2022 走看看