在Java中判断两个Long对象是否相等

抛出问题:

Long a = 4l;
Long b = 4l;
a == b //true
Long a = 128l;
Long b = 128l;
a == b //false

如果Long的值在[-127,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);
    }

如果不在[-127,128]之间,则会new一个新对象,自然“==”两个不同的对象,其结果必然是false了。

解决方案:

1、使用Long中的longValue()进行转换

Long a = 128l;
Long b = 128l;
a.longValue() == b.longValue() //true

2、使用Long中的equals()

Long a = 128l;
Long b = 128l;
a.equals(b);//true

下面是该方法源码:

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

两个Long类型比较存在的坑

一般来说,两个基本数据类型比较用 “==” 就可以了,平时很少用Long类型比较。

但是最近写项目时遇到了两个Long类型比较,当时也是直接用的双等于,然而当debug时却发现代码执行到这两个Long类型比较判断时并没有进入这个判断体内,然后上网搜索相关的问题, 其实很简单,但是不知道的话就很很容易入坑。

解决方法具体如下:

可以让两个Long类型的变量分别调用 ==longValue()== 方法来实现就可以了。

代码:

Long a=...;
Long b=...;
if (a.longValue() == b.longValue()) {
             ...;
}

其实Long是java数据包装类的一种,以上属于包装类Long转化为基本数据类型long的情况,以下列举其它数据包装类拆箱转化为基本数据类型的情况:

Integer转为int,需要调用intValue()方法

Double转为double,需要调用doubleValue()方法

Float转为float,需要调用floatValue()方法

总结:

某包装类Xxx转为对应的基本数据类型时,则调用xxxValue()方法。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Java的long和bigint长度对比详解

    Java 中Long的值大小比较 java.util.Lang 对象吧,而不是基本类型 long  (注意大小写) Java中如果使用 == 双等于比较对象,等于比较的是两个对象的内存地址,也就是比较两个对象是否是同一个对象 如果比较两个Long对象值是否相等,则不可以使用双等号进行比较,可以采用如下方式: 1. 使用 equals 方法 Long a = new Long(3); Long b = new Long(3); System.out.println(a.equals(b)); 2.

  • java Long==Long有趣的现象详解

    前言 long数据类型是64位有符号的Java原始数据类型.当对整数的计算结果可能超出int数据类型的范围时使用. long数据类型范围是-9,223,372,036,854,775,808至9,223,372,036,854,775,807(-2^63至2^63-1). long数据类型范围内的所有整数称为long类型的整数字面量.long类型的整数常数总是以大写L或小写l结尾. 1. 描述 首先,这里应该声明一下,Long等对象类型判断是否相等,采用Long == Long这种形式是错误的.

  • Java中long类型与Long类型的区别和大小比较详解

    前言 最近在学习java,接触到了long类型,发现网上这方面的资料较乱,所以决定总结一下,在Java中我们经常要做一些判断,而对于判断的话,用的最多的便是">"."=="."<"的比较,这里我们进行一个Long类型数据和long类型数据的比较大小的讲解.话不多说了,来一起看看详细的介绍吧. Java中Long和long的区别 Java的数据类型分为两种: 1.基本类型:byte(8),short(16),int(32),long(6

  • java判断Long类型的方法和实例代码

    java判断是否是Long类型 1.首先定义一个getType方法,接收一个Object类型的参数: 2.然后使用getClass方法获取class类型的对象: 3.再使用toString()方法转为字符串,并使用substring截取字符串获得变量类型: 4.最后根据变量类型和Long字符串进行对比即可 public class HelloWorld { public static void main(String[] args) { Boolean res = getType(1232343

  • Java编程long数据类型的使用问题

    在Java编程中经常遇到一些整数类型的使用问题,下面我们来看看长整形数据使用问题. 今天在写一个java线程的时候,想让线程休眠720小时候继续执行,代码如下: long runSperiod = 720 * 60 * 60 * 1000; Thread.sleep(runSperiod) 启动线程测试的时候,发现线程并没有按照预想的720小时候后执行,而是不停在执行,最后跟踪代码发现 runSperiod 的值时负数.仔细研究后发现,java在处理几个数相乘时,如果几个数都是 int 类型,那

  • 在Java中判断两个Long对象是否相等

    抛出问题: Long a = 4l; Long b = 4l; a == b //true Long a = 128l; Long b = 128l; a == b //false 如果Long的值在[-127,128]之间,用"=="判断是否相等是没问题的,如果不在这个区间,是不能用"=="的,原因如下源码解释: public static Long valueOf(long l) { final int offset = 128; if (l >= -12

  • 如何在Java中判断两个Long类型是否相等

    目录 一.为什么同样的类型,同样的值,却不相等呢? 1.探索一下源码 二.解决方案 1.可以使用.longValue() 2.equals()进行比较 三.例子 一.为什么同样的类型,同样的值,却不相等呢? 1.探索一下源码 源码中显示,Long中有一个静态的内部类LongCache,专门用于缓存-128至127之间的值,一共256个元素. 如果值在[-128, 127]之间,会放在缓存里面,而超过这个范围就要new一个新的对象,也就是说==不能判断对象是否相等.当然,如果值是在[-128, 1

  • 在java中判断两个浮点型(float)数据是否相等的案例

    示例代码: public static void main(String[] args) { float a = 10.222222225f; float b = 10.222222229f; System.out.println("使用==判断是否相等:" + (a == b));// 超出精度范围 System.out.println("使用Math.abs()判断是否相等:" + (Math.abs(a - b) >= 0)); System.out.p

  • Java中判断字符串是否相等的实现

    在最近的开发中,我踩到一个坑,过程是这样的.我需要在Java中判断两个字符串是否相等,按照以往的经历使用 == 双等号的操作符来判断,但是在Java中,这样写却没有实现我想要的效果.经过查阅资料后,把得到的经验分享给大家. 相等判断操作符== Java中,==相等判断符用于判断基本数据类型和引用数据类型. 当判断基本数据类型的时候判断的是数值,当判断引用数据类型时判断变量是否指向同一引用对象. 使用==判断字符串时,判断的是两个字符串是否指向同一个对象.如果两个字符串指向同一个对象,那么它们就是

  • Java与JavaScript中判断两字符串是否相等的区别

    JavaScript是一种常用的脚本语言,这也决定了其相对于其他编程语言显得并不是很规范.在JavaScript中判断两字符串是否相等 直接用==,这与C++里的String类一样.而Java里的等号则是判断两字符串的引用是否一样,判断实体需要用equals()方法,或 者compareTo()方法,这里需要强调的是equals()方法的参数类型,其参数类型绝对不是String类,而是Object类,咱不止一次看 到国内一些教程写的是String类(o(╯□╰)o) 大家可以看看JDK的源码:

  • Java中判断对象是否为空的方法的详解

    首先来看一下工具StringUtils的判断方法: 一种是org.apache.commons.lang3包下的: 另一种是org.springframework.util包下的.这两种StringUtils工具类判断对象是否为空是有差距的: StringUtils.isEmpty(CharSequence cs); //org.apache.commons.lang3包下的StringUtils类,判断是否为空的方法参数是字符序列类,也就是String类型 StringUtils.isEmpt

  • 在js与java中判断json数据中是否含有某字段的案例

    js中 从服务端传过来一个json数据为data 1.data["key"] != undefined //这种有缺陷,如果这个key定义了,并且就是很2的赋值为undefined,那么这句就会出问题了 2.!("data" in obj) 3.data.hasOwnProperty("key") //后面两种推荐使用 java程序中判断是否存在 data 为从浏览器传回来的json数据 当读取数据的时候最好先加一个判断,不然如果里面不含有该数据

  • 关于Java中String创建的字符串对象内存分配测试问题

    一.创建String对象的两种常用方法比较 举例说明 String str1 = "Java天下第一"; //方法1 String str2 = new String("Java天下第一"); //方法2 System.out.println(str1 == str2); //比较地址,false System.out.println(str1 == str2.intern()); //true 区别 2.1 方法1中,首先会去JVM的常量池里查找是否有存储&quo

  • java中的this引用及对象构造初始化

    目录 1. this 引用 1.1 为什么要有this引用 1.2 什么是this引用 1.3 this引用的特性 1.4 this引用练习题 2. 对象的构造及初始化 2.1 如何初始化对象 2.2 构造方法 2.2.1 概念 2.2.2 特性 2.3 默认初始化 2.4 就地初始化 1. this 引用 1.1 为什么要有this引用 先来写一个日期类的例子: public class classCode { public int year; public int month; public

  • java中判断字段真实长度的实例(中文2个字符,英文1个字符)

    实例如下: public class Char_cn { public static void main(String[] args) { // TODO Auto-generated method stub String haha = "我叫兜兜abcd"; int true_num = String_length(haha); System.out.println("true" + true_num); int false_num = haha.length()

随机推荐