java中包装数据类型与基本数据类型比较相等的问题
2017-09-27 16:21
363 查看
最近检查之前写过的代码,突然发下了一个问题,现场还原如下:
@Test public void testEquals2(){ System.out.println(new Long(1000).equals(1000)); }
根据平时对基础的理解,乍一看,没什么问题,但是经过运行得出的结果为:false
于是:
@Test public void testEquals(){ System.out.println(new Long(1000).equals(1000)); //false System.out.println(new Long(1000).equals(1000L)); //true System.out.println(1000l == 1000);//true }
结果输入依次为:
false
true
true
分析原因:
虽然在基本数据类型的比较中long 1000与 int 1000 是相等的,因为这里面有个自动类型提升,会将
int 自动类型提升为long类型,最终就是1000L == 1000L了所以,一定是相等的,而使用包装数据
类型java.lang.Long时,由于是做equals对象比较,如果是不同数据类型就一定不会认定为相等,看
java.lang.Long.equals();方法源码:
public boolean equals(Object obj) { if (obj instanceof Long) { return value == ((Long)obj).longValue(); } return false; }
如果不是Long类型就直接认定为不相等,而java.lang.Integer与java.lang.Long类型是同样继承自java.lang.Number类,所以,不管是什么Integer 与Long 比较永远不会相等。
在new Long(1000).equals(1000)中,1000会自动(根据基本数据类型进行装箱)装箱为java.lang.Integer而不是java.lang.Long类型
所以。。。。。
@Test public void test(){ Object x = 1000; Object y = 1000L; Object z = 1000d; System.out.println(x.getClass()); System.out.println(y.getClass()); System.out.println(z.getClass()); }
结果分别是:
class java.lang.Integer
class java.lang.Long
class java.lang.Double
结语:
在平时使用这些做比较时一定要注意类型区分,不要坠入这好像是正确的”陷阱”里。。。。
相关文章推荐
- Java 基本数据类型与其包装数据类型以及字符串(String)之间的转换问题
- Java为什么两个值相等的对象==比较返回false而两个值相等的不同类型的的基本数据类型返回true
- [疯狂Java]面向对象:基本类型的包装器类型、自动装箱/拆箱、包装器类型大小/相等比较
- C++与Java基本数据类型比较
- 黑马程序员-Java基础知识预备之Java基本数据类型的包装类
- java的栈与堆(基本数据类型与包装数据类型)详解
- 关于java基本数据类型的包装类的自动装箱池的大小
- java的栈与堆(基本数据类型与包装数据类型)详解
- java 对象类型与基本数据类型传参的比较
- C++与Java基本数据类型比较
- java中的String 类型易错点总结(相等比较和传值问题)
- java与.net比较学习系列(3) 基本数据类型和类型转换
- 黑马程序--JAVA字符串String、StringBuffer、StringBuilder、基本数据类型包装
- C++与Java基本数据类型比较
- Java中基本数据类型和包装数据类型在Hibernate中使用
- Java第一课 Java的一些基本概念,Java的起源、为什么我们要学习Java语言,Java跨平台原理剖析;Java环境变量的配置,初学者常犯的问题,Java语言的基本数据类型和Java的语句。
- Java基础复习:基本数据类型的包装类
- Java中基本数据类型和包装数据类型在Hibernate中使用