integer比较_Java中的整型包装类值的比较为什么不能用==比较?原因是因为缓存
我们可能从书上能看到,所有整型包装类对象之间值的比较,全部使用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中的整型包装类值的比较为什么不能用==比较?原因是因为缓存相关推荐
- 为什么java button 不能用 显示红色_Java中的整型包装类值的比较为什么不能用==比较?原因是因为缓存...
我们可能从书上能看到,所有整型包装类对象之间值的比较,全部使用equals进行比较,那么为什么不能用 "==" 比较呢?我们先看下面的例子. Example1: public cl ...
- char怎么比较_为什么阿里巴巴Java开发手册中强制要求整型包装类对象值用 equals 方法比较?...
在阅读<阿里巴巴Java开发手册>时,发现有一条关于整型包装类对象之间值比较的规约,具体内容如下: 这条建议非常值得大家关注, 而且该问题在 Java 面试中十分常见. 还需要思考以下几个 ...
- java定义integer数组_Java中的Integer
包装类---Integer Integer 类在对象中包装了一个基本类型int的值.Integer类型的对象包含一个 int 类型的字段.此外,该类提供了多个方法,能在 int 类型和 String ...
- c语言中整形精确到后面几位,C语言中普通整型变数在记忆体中占几个位元组
C语言中普通整型变数在记忆体中占几个位元组以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! C语言中普通整型变数在记忆体中 ...
- CC++中的整型常识
很多人对C/C++中的整型不太了解,导致代码移植的时候出现问题,本人在此总结一下,若有描述错误,请务必指出,谢谢! a. C/C++对整型长度的规定是为了执行效率,将int定义为机器字长可以取得最大的 ...
- C语言整型量包括哪些,C语言中的整型量
整型量 整型量包括整型常量.整型变量.整型常量就是整常数.在C语言中,使用的整常数有八进制.十六进制和十进制三种. 整型常量 1.八进制整常数八进制整常数必须以0开头,即以0作为八进制数的前缀.数码取 ...
- 隐式类型转换——C语言中的整型提升
整型提升概念: C语言中的整型算术运算总是至少以缺省整型类型的精度来进行的. 为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升. 整型提升的意义 三点说明 ...
- python中int占几个字节_Python中的整型占多少个字节?
说到计算机中的整型,相信很多人都会联想到32位整型(或者int),是程序员日常生活中用的最多的一种类型.32位整型顾名思义,占用32个位也就是4个字节,取值范围−2,147,483,648~ 2,14 ...
- Arduino 从串口接收到的数据中提取整型数据(parseInt)
Arduino 从串口接收到的数据中提取整型数据(parseInt) 函数说明 parseInt函数可用于从设备接收到的数据中寻找整数数值. 该函数属于Stream类.该函数可被Stream类的子类所 ...
最新文章
- Java开发web的几种开发模式
- 解读main()方法中的String[] args
- hive防止数据误删
- xmanager linux,教您用xmanager启动Linux上的图形界面程序-Go语言中文社区
- ArcGIS Engine开发之旅02--ArcGIS Engine中的类库
- 普惠数据科学应用,九章云极携手伙伴共探智慧未来
- hadoopstreaming
- form表单input file类型的重置
- 如何制作好一个提交按扭---我是个爱折腾的人
- 基于深度学习的自动化行人检测和监控系统
- 1.3 Zend_Acl (3)
- iOS开发之上传应用至APP store - 加急审核, 本人亲测苹果加速审核一年不止两次,只要理由充分,是可以多次的 。不过尽量避免
- 2017年我国大数据趋势分析
- 问题:IndentationError: unindent does not match any outer indentation level
- ios系统安装android,iPhone上安装Android系统详细步骤。
- 计算机处理器性能排名,cpu天梯图2018最新版 2018电脑cpu处理器性能排行榜
- 关于const A* f(const A* pSrc,A* const pDst,int v=2,...) const throw();
- android开发艺术探索3:IPC--AIDL(跨进程)的使用
- 【Kubernetes】k8s的安全管理详细说明【k8s框架说明、token验证和kubeconfig验证详细说明】
- 那些靠互联网年赚百万的大佬们是如何赚钱的?
热门文章
- 苹果折叠屏iPhone不会在明年推出 最快2025年出货
- 2022春节档新片预售总票房达1.08亿
- 福布斯发布美国富豪榜:贝索斯居首 盖茨跌出前二
- 苏宁易购上半年营收936.06亿元,零售云加盟店新开1381家
- 你在支付宝上搞钱,“90后”却在相亲
- 外媒:高通、微软和谷歌担忧英伟达收购Arm将损害竞争
- 阿里拍卖官方客服全面升级 推出一对一教你“一站式服务”
- 联发科预计天玑系列5G智能手机处理器今年出货超4500万颗
- 刚嘲讽过iPhone 12,三星就打算“抄”了:取消赠送充电头和耳机?
- 有人抄袭微信红包和表情被罚了40万!这下“吹牛”可能牛不起来了