Integer类型与java的基本类型之间的==与equals()比较结果测试 2022-01-15 02:25 172阅读 0赞 ### 一、Integer与Integer的比较 ### 在使用Integer类型时,常常会不经意就使用==来做判断条件,但是下面的代码就出乎了我们的意料: Integer a = 127; Integer b = 127; Integer c = 128; Integer d = 128; System.out.println("a==b:\t"+(a==b)); System.out.println("c==d:\t"+(c==d)); 我们预期的结果是不是 true true? 实际结果: ![20190614203429531.png][] **为什么会产生这样的问题?** 是因为在java常量池中默认缓存了-128~127之间的整数,当Integer类型的对象值在此区间时,对象会直接去读取常量池的值,所以使用==比较时他们都指向同一个地址,但是一旦超出这个范围,Integer就会创建一个新的对象,这时两个Integer对象的地址就不同了,因此结果为false。 换种方式,我们使用Integer对象的equals方法再试一试: Integer a = 127; Integer b = 127; Integer c = 128; Integer d = 128; System.out.println("a==b:\t"+(a==b)); System.out.println("c==d:\t"+(c==d)); System.out.println("a.equals(b):\t"+a.equals(b)); System.out.println("c.equals(d):\t"+c.equals(d)); 这次的结果应该很明显了,equals()比较的是两个对象中的值,输出结果: ![20190614203856314.png][] **结论1:我们在使用Integer对象进行值比较判断时,应该尽量使用其对象的equals()方法,以避免这种低级的bug。** 以上情况在int类型中不会出现,int类型与Integer类型使用==比较时,Integer会自动拆箱为int类型,再进行比较,因此结果为true;Integer类型使用其对象的equals()方法与int类型进行比较时,int类型会自动装箱为Integer类型,再进行值比对,因此结果也是true。 ### 二、Integer类型与其他基本类型之间的比较 ### 有时候我们也经常将short、float、double、long、byte和char等类型进行比较,但是比较的结果真的会和我们预期的一样吗?下面我们就来试验一把。 代码: Integer a = 127; Integer b = 128; short s1 = (short) 127; short s2 = (short) 128; Short s3 = (short) 127; short s4 = (short) 128; float f1 = 127.0F; float f2 = 128.0F; Float f3 = 127.0F; Float f4 = 128.0F; double d1 = 127D; double d2 = 128D; Double d3 = 127D; Double d4 = 128D; long l1 = 127L; long l2 = 128L; Long l3 = 127L; Long l4 = 128L; byte b1 = 127; Byte b2 = 127; char ch1 = 127; char ch2 = 128; Character ch3 = new Character(ch1); Character ch4 = new Character(ch2); System.out.println("--------------short--------------"); System.out.println(a==s1); System.out.println(b==s2); System.out.println(a.equals(s1)); System.out.println(b.equals(s2)); System.out.println("---------------Short-------------"); // System.out.println(a==s3);// 编译异常 // System.out.println(b==s4);// 编译异常 System.out.println(); System.out.println(); System.out.println(a.equals(s3)); System.out.println(b.equals(s4)); System.out.println("--------------float--------------"); System.out.println(a==f1); System.out.println(b==f2); System.out.println(a.equals(f1)); System.out.println(b.equals(f2)); System.out.println("---------------Float-------------"); // System.out.println(a==f3);// 编译异常 // System.out.println(b==f4);// 编译异常 System.out.println(); System.out.println(); System.out.println(a.equals(f3)); System.out.println(b.equals(f4)); System.out.println("--------------double--------------"); System.out.println(a==d1); System.out.println(b==d2); System.out.println(a.equals(d1)); System.out.println(b.equals(d2)); System.out.println("---------------Double-------------"); // System.out.println(a==d3);// 编译异常 // System.out.println(b==d3);// 编译异常 System.out.println(); System.out.println(); System.out.println(a.equals(d3)); System.out.println(b.equals(d4)); System.out.println("---------------long-------------"); System.out.println(a==l1); System.out.println(b==l2); System.out.println(a.equals(l1)); System.out.println(b.equals(l2)); System.out.println("---------------Long-------------"); // System.out.println(a==l3);// 编译异常 // System.out.println(b==l4);// 编译异常 System.out.println(); System.out.println(); System.out.println(a.equals(l3)); System.out.println(b.equals(l4)); System.out.println("---------------byte-------------"); System.out.println(a==b1); System.out.println(a.equals(b1)); System.out.println("---------------Byte-------------"); // System.out.println(a==b2);// 编译异常 System.out.println(); System.out.println(a.equals(b2)); System.out.println("---------------char-------------"); System.out.println(a==ch1); System.out.println(b==ch2); System.out.println(a.equals(ch1)); System.out.println(b.equals(ch2)); System.out.println("---------------Char-------------"); // System.out.println(a==ch3);// 编译异常 // System.out.println(b==ch4);// 编译异常 System.out.println(); System.out.println(); System.out.println(a.equals(ch3)); System.out.println(b.equals(ch4)); 再看下运行的结果: ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L01yX19WaWtpbmc_size_16_color_FFFFFF_t_70][] **结论2:****Integer在和其他基本类型进行比较时,若Integer类型使用==和其他基本类型的拆箱模式比较其结果都为true,Integer类型对象使用equals()方法和其他基本类型拆箱模式进行比较其结果都为false;若Integer类型使用==和其他基本类型的包装类型进行比较时都会报编译异常,无法进行比较,Integer类型对象使用equals()方法和其他基本类型的包装类进行比较其结果都为false。** **另外我注意到一个问题,在idea编译器中,我的a.equals(c)的这类方法它都警告我,其结果会一直是true,看截图:** ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L01yX19WaWtpbmc_size_16_color_FFFFFF_t_70 1][] **但是我们从运行结果来看,idea的判断完全是错误的,因此我们有时候也不能完全信任编译器。** ## ## [20190614203429531.png]: /images/20220114/e24bf37c1cbf4d2daf27642075f08c8c.png [20190614203856314.png]: /images/20220114/9650e9ac43e34328ab996c001b62edfa.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L01yX19WaWtpbmc_size_16_color_FFFFFF_t_70]: /images/20220114/952b51640274419699e616af35c69c61.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L01yX19WaWtpbmc_size_16_color_FFFFFF_t_70 1]: /images/20220114/68c48eb7010e4dbd959568dc49dc9169.png
相关 基本数据类型int与包装类Integer的区别 Integer 1、基本数据类型与包装类的区别 2、为什么Integer超出-128、127时==为false ╰半橙微兮°/ 2023年09月28日 14:34/ 0 赞/ 11 阅读
相关 Java:基本类型int与封装类Integer的比较 int和Integer的区别 1、Integer是int的包装类,int则是java的一种基本数据类型 2、Integer变量必须实例化后才能使用,而int变量不需要 朱雀/ 2023年03月13日 15:25/ 0 赞/ 133 阅读
相关 equals,==与基本数据类型的自动拆装箱 Integer类型的自动拆装箱范围(-128 --- 127)之间,用==没问题; 大于127时,==就凉了.所以equals通用.Integer类型就用equals() 迈不过友情╰/ 2023年02月11日 03:13/ 0 赞/ 29 阅读
相关 java,c,c++ 语言之间基本数据类型的比较 原文:[http://blog.csdn.net/wu928320442/article/details/5825170][http_blog.csdn.net_wu92832 红太狼/ 2022年06月18日 10:17/ 0 赞/ 157 阅读
相关 Java包装类与基本类型进行比较的坑 今天使用Java的包装类和基本类型做比较的时候发现了包装本身存在的坑,参考的JDK版本是1.8.0\_121,下面是例子代码: Short packShort=1; 刺骨的言语ヽ痛彻心扉/ 2022年06月10日 01:59/ 0 赞/ 82 阅读
相关 (基本数据类型下) 的equals方法和==的比较 理解string的equals方法和 == 方法 > string 的 == 比较的是地址是否相等 > string 的equals 比较的是 > 1.先判断地址是否 拼搏现实的明天。/ 2022年06月02日 08:37/ 0 赞/ 91 阅读
相关 Java 基本类型与引用类型 Java 基本类型与引用类型 一、基本数据类型 java 中一共分为 8 种基本数据类型:byte、short、int、long、float、double、char 待我称王封你为后i/ 2022年02月27日 14:06/ 0 赞/ 206 阅读
相关 Java基本数据类型的包装类型的比较 基本数据类型的包装类型比较分为两种类型: 相同类型比较 `Number`类型比较时,只要有一个调用了拆箱,就可以用`“==”`比较,无论是调用`int 谁践踏了优雅/ 2022年02月15日 15:51/ 0 赞/ 175 阅读
相关 java基本数据类型与引用类型 变量的类型包括: 基本类型和引用类型。 基本类型就8种: boolean – 布尔,就是真 true 或假 false byte short int long 系统管理员/ 2022年02月14日 05:59/ 0 赞/ 236 阅读
相关 Integer类型与java的基本类型之间的==与equals()比较结果测试 一、Integer与Integer的比较 在使用Integer类型时,常常会不经意就使用==来做判断条件,但是下面的代码就出乎了我们的意料: Integer a 你的名字/ 2022年01月15日 02:25/ 0 赞/ 173 阅读
还没有评论,来说两句吧...