我们可能从书上能看到,所有整型包装类对象之间值的比较,全部使用equals进行比较,那么为什么不能用 "==" 比较呢?我们先看下面的例子。

Example1:

public class Demo3 {    public static void main( String[] args ) {        Integer a = 2;        Integer b = 2;        System.out.println(a == b);//保存的是地址    }}

Example2:

public class Demo3 {    public static void main( String[] args ) {        Integer a = 222;        Integer b = 222;        System.out.println(a == b);//保存的是地址    }}

通过测试Example1 的结果为 True;

Example2的结果为false;

那么为什么呢?

下面先看下字节码:

我们看到划线的部分:

Integer i = 2;会自动装箱,调用Integer.valueOf()方法进行转换。

 public static Integer valueOf(int i) {        if (i >= IntegerCache.low && i <= IntegerCache.high)            return IntegerCache.cache[i + (-IntegerCache.low)];        return new Integer(i);    }
static final int low = -128;IntegerCache.high >= 127

也就是说,如果Integer的范围在 -128~127之间,则调用valueOf方法时,会从缓存中获取。

private static class IntegerCache {        static final int low = -128;        static final int high;        static final Integer cache[];        static {            // high value may be configured by property            int h = 127;            String integerCacheHighPropValue =                sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");            if (integerCacheHighPropValue != null) {                try {                    int i = parseInt(integerCacheHighPropValue);                    i = Math.max(i, 127);                    // Maximum array size is Integer.MAX_VALUE                    h = Math.min(i, Integer.MAX_VALUE - (-low) -1);                } catch( NumberFormatException nfe) {                    // If the property cannot be parsed into an int, ignore it.                }            }            high = h;            cache = new Integer[(high - low) + 1];            int j = low;            for(int k = 0; k < cache.length; k++)                cache[k] = new Integer(j++);            // range [-128, 127] must be interned (JLS7 5.1.7)            assert IntegerCache.high >= 127;        }        private IntegerCache() {}    }

那么为什么Example1为true呢?

Integer a = 2;

Integer b = 2;

都是从缓存中获取相同的对象。

那么为什么Example2为false呢?

Integer a = 222;//new Integer(222)

Integer b = 222;//new Integer(222)

a== b 比较的是地址,所以为false;

所以说对Integer 进行值比较时,需要用equals方法

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

分享一个面试题

面试题:

主方法定义两个Integer变量,并赋值

然后通过一个swap方法交换变量的值

请写出swap方法的实现

实现程序如下:

public class Demo {    //java中的传值方式  按值传递  引用传递    public static void main( String[] args ) {        Integer a = 1;//装箱 Interger.valueof()        Integer b = 2;        System.out.println("Before swap:a="+a+",b="+b);        //把 a,b 的值进行交换        swap(a,b);        System.out.println("After swap:a="+a+",b="+b);    }    private static void swap( Integer a, Integer b ) {        Integer tmp = a;        a = b;        b= tmp;    }}

结果:

Before swap:a=1,b=2After swap:a=1,b=2

为什么没有改变呢?因为用的是值传递,图示如下:

1、初始状态

2.交换过后

所以swap方式只是改变了 num1和 num2的引用,并没有改变 a 和 b 的引用。

那么怎么实现 才是正确的呢?通过反射

   private static void swap( Integer a, Integer b ) {        try {           Field field =  Integer.class.getDeclaredField("value");            field.setAccessible(true);           int tmp = a.intValue();           // 获取b的值,调用valueof           field.set(a,b);//取b的值,走valueOf           field.set(b,new Integer(tmp));        } catch (Exception e) {            e.printStackTrace();        }    }

总结

所有整型包装类对象之间值的比较,全部使用 equals 方法比较。

说明:对于 Integer var = ? 在-128 至 127 之间的赋值,Integer 对象是在 IntegerCache.cache 产生,

会复用已有对象,这个区间内的 Integer 值可以直接使用==进行判断,但是这个区间之外的所有数据,都会在堆上产生,并不会复用已有对象,这是一个大坑,推荐使用 equals 方法进行判断

integer比较_Java中的整型包装类值的比较为什么不能用==比较?原因是因为缓存相关推荐

  1. 为什么java button 不能用 显示红色_Java中的整型包装类值的比较为什么不能用==比较?原因是因为缓存...

    我们可能从书上能看到,所有整型包装类对象之间值的比较,全部使用equals进行比较,那么为什么不能用 "==" 比较呢?我们先看下面的例子. Example1: public cl ...

  2. char怎么比较_为什么阿里巴巴Java开发手册中强制要求整型包装类对象值用 equals 方法比较?...

    在阅读<阿里巴巴Java开发手册>时,发现有一条关于整型包装类对象之间值比较的规约,具体内容如下: 这条建议非常值得大家关注, 而且该问题在 Java 面试中十分常见. 还需要思考以下几个 ...

  3. java定义integer数组_Java中的Integer

    包装类---Integer Integer 类在对象中包装了一个基本类型int的值.Integer类型的对象包含一个 int 类型的字段.此外,该类提供了多个方法,能在 int 类型和 String ...

  4. c语言中整形精确到后面几位,C语言中普通整型变数在记忆体中占几个位元组

    C语言中普通整型变数在记忆体中占几个位元组以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! C语言中普通整型变数在记忆体中 ...

  5. CC++中的整型常识

    很多人对C/C++中的整型不太了解,导致代码移植的时候出现问题,本人在此总结一下,若有描述错误,请务必指出,谢谢! a. C/C++对整型长度的规定是为了执行效率,将int定义为机器字长可以取得最大的 ...

  6. C语言整型量包括哪些,C语言中的整型量

    整型量 整型量包括整型常量.整型变量.整型常量就是整常数.在C语言中,使用的整常数有八进制.十六进制和十进制三种. 整型常量 1.八进制整常数八进制整常数必须以0开头,即以0作为八进制数的前缀.数码取 ...

  7. 隐式类型转换——C语言中的整型提升

    整型提升概念: C语言中的整型算术运算总是至少以缺省整型类型的精度来进行的. 为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升. 整型提升的意义 三点说明 ...

  8. python中int占几个字节_Python中的整型占多少个字节?

    说到计算机中的整型,相信很多人都会联想到32位整型(或者int),是程序员日常生活中用的最多的一种类型.32位整型顾名思义,占用32个位也就是4个字节,取值范围−2,147,483,648~ 2,14 ...

  9. Arduino 从串口接收到的数据中提取整型数据(parseInt)

    Arduino 从串口接收到的数据中提取整型数据(parseInt) 函数说明 parseInt函数可用于从设备接收到的数据中寻找整数数值. 该函数属于Stream类.该函数可被Stream类的子类所 ...

最新文章

  1. Java开发web的几种开发模式
  2. 解读main()方法中的String[] args
  3. hive防止数据误删
  4. xmanager linux,教您用xmanager启动Linux上的图形界面程序-Go语言中文社区
  5. ArcGIS Engine开发之旅02--ArcGIS Engine中的类库
  6. 普惠数据科学应用,九章云极携手伙伴共探智慧未来
  7. hadoopstreaming
  8. form表单input file类型的重置
  9. 如何制作好一个提交按扭---我是个爱折腾的人
  10. 基于深度学习的自动化行人检测和监控系统
  11. 1.3 Zend_Acl (3)
  12. iOS开发之上传应用至APP store - 加急审核, 本人亲测苹果加速审核一年不止两次,只要理由充分,是可以多次的 。不过尽量避免
  13. 2017年我国大数据趋势分析
  14. 问题:IndentationError: unindent does not match any outer indentation level
  15. ios系统安装android,iPhone上安装Android系统详细步骤。
  16. 计算机处理器性能排名,cpu天梯图2018最新版 2018电脑cpu处理器性能排行榜
  17. 关于const A* f(const A* pSrc,A* const pDst,int v=2,...) const throw();
  18. android开发艺术探索3:IPC--AIDL(跨进程)的使用
  19. 【Kubernetes】k8s的安全管理详细说明【k8s框架说明、token验证和kubeconfig验证详细说明】
  20. 那些靠互联网年赚百万的大佬们是如何赚钱的?

热门文章

  1. 苹果折叠屏iPhone不会在明年推出 最快2025年出货
  2. 2022春节档新片预售总票房达1.08亿
  3. 福布斯发布美国富豪榜:贝索斯居首 盖茨跌出前二
  4. 苏宁易购上半年营收936.06亿元,零售云加盟店新开1381家
  5. 你在支付宝上搞钱,“90后”却在相亲
  6. 外媒:高通、微软和谷歌担忧英伟达收购Arm将损害竞争
  7. 阿里拍卖官方客服全面升级 推出一对一教你“一站式服务”
  8. 联发科预计天玑系列5G智能手机处理器今年出货超4500万颗
  9. 刚嘲讽过iPhone 12,三星就打算“抄”了:取消赠送充电头和耳机?
  10. 有人抄袭微信红包和表情被罚了40万!这下“吹牛”可能牛不起来了