`

Java判断Long类型相等问题

阅读更多
// Long类型判断相等时,比如Long a = 10L, Long b = 10L;习惯是判断a == b;
Long a = 10L;
Long b = 10L;
		
if(a == b) { // true
  System.out.println("aike1");
}
		
Long c = 128L;
Long d = 128L;
		
if(c == d) { // false
  System.out.println("aike2");
}

if(c.valueOf(12) == d.valueOf(12)) { // true
  System.out.println("aike3");
}
		
if(c.valueOf(128) == d.valueOf(128)) { // false
  System.out.println("aike4");
}

// 为什么等于128时就不相等呢?

// 查看Java源码Long.class
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的实例。

对于新创建的Long实例, ==比较是否为同一对象, 所以大于127就不相等了。*/

// 判断方法 使用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()比较



分享到:
评论

相关推荐

    Java 判断数组是否相等的方法示例

    主要介绍了Java 判断数组是否相等的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    JAVA面试题最全集

    1.Java有那些基本数据类型,String是不是基本数据类型,他们有何区别。 2.字符串的操作: 写一个方法,实现字符串的反转,如:输入abc,输出cba 写一个方法,实现字符串的替换,如:输入bbbwlirbbb,输出...

    【02-数据类型与运算符】

     •Java 的基本数据类型可以分为两大类: boolean 类型 和 数值类型.  •而数值类型又可以分为整型和浮点型  –整型包括:byte short int long(广义的整型包括char型)  –在内存中各占:1,2,4,8个字节, 各有各...

    2.Java基础语法.ppt

    比较引用变量时是判断两个在堆中的存储的地址是否相等 equals:操作时是判断两个变量是否是对同一对象的引用,即对堆中的内容进行比较 在比较引用变量时: ==判断的对象的地址 equals判断的是对象的内容 4.位...

    整理后java开发全套达内学习笔记(含练习)

    long类型值,需跟L或l在数据后;float类型要跟f或F;或强制类型转换 科学计数法:12.5E3 类型转换默认序列: byte &gt; short &gt; int &gt; long &gt; float &gt; double char 」 注意:默认类型转换(自动类型提升)会丢失精度...

    超全Java面试题(精简版)持续更新….

    1、 Java类型是什么? Java8大基本数据类型是什么? byte、short 、int、long、float、double、boolean、char 2、什么是装箱?什么是拆箱? 装箱就是 自动将基本数据类型转换为包装器类型 拆箱就是 自动将包装器类型转换...

    Android静默安装常用工具类

    isEquals(Object actual, Object expected) 比较两个对象是否相等 compare(V v1, V v2) 比较两个对象大小 transformIntArray(int[] source) Integer 数组转换为int数组 源码可见ObjectUtils.java,更多方法及更详细...

    最新JAVA编程题全集_50题及答案

    long digui(int i) {if(i==0||i==1) { return 1; } else { return i*digui(i-1); } } 4. 写一个单例模式(遇到两次) public class Test { private Test(){} private static Test test; ...

    sesvc.exe 阿萨德

    如果桶是一个链表则需要遍历判断里面的 hashcode、key 是否和传入 key 相等,如果相等则进行覆盖,并返回原来的值。 如果桶是空的,说明当前位置没有数据存入;新增一个 Entry 对象写入当前位置。 void addEntry(int...

    【05-面向对象(下)】

    •八大数据类型的包装类分别为:Byte、Short、Integer、Long、Character、 Float、Double、Boolean。 把基本数据类型变量包装类实例是通过对应包装类的构造器来实现的,不仅如此,8个包装类中除了 Character之外,...

    jsp内置对象的用法

    3 boolean equals(Object obj) 判断此Object是否与指定的Object对象相等 4 void copy(Object obj) 把此Object拷贝到指定的Object对象中 5 Object clone() 克隆此Object对象 6 String toString() 把此Object...

    IO输入输出留

    java.io 包 java.io.File ============================================================================================ *表示磁盘文件或目录的路径 *可以表示一个不存在的路径 创建实例 --------------------...

    freemarker总结

    =或者==:判断两个值是否相等. 2. !=:判断两个值是否不等. 3. &gt;或者gt:判断左边值是否大于右边值 4. &gt;=或者gte:判断左边值是否大于等于右边值 5. &lt;或者lt:判断左边值是否小于右边值 6. 或者lte:判断左边值是否...

    C++复习资料之系列

    复习资料 1.1选择题 1.在一个C++程序中,main函数的位置( c )。 (a) 必须在程序的开头 (b) 必须在程序的后面 ( c ) 可以在程序的任何地方 (d) 必须在其它函数中间 2.... (a) 解释 (b) 汇编 (c) 编辑 (d) 编译 ...

    PHP基础教程 是一个比较有价值的PHP新手教程!

    $a == $b :相等 $a != $b :不等 $a $b :小于 $a $b :小于等于 $a &gt; $b :大于 $a &gt;= $b :大于等于 与C一样PHP也有三重运算符(?:)。位操作符在PHP同样存在。 优先权 就和C以及Java一样! 2.7 控制流程结构 ...

Global site tag (gtag.js) - Google Analytics