s == t 何解?
Integer s=
new
Integer(
9
);
Integer t=
new
Integer(
9
);
Long u=
new
Long(
9
);
(s==t) 这个是错的,只要有new这个关键字,就是开辟空间,用的是引用
Integer s =9;
Integer t =9;
(s==t) 这个是对的,在【-128,127】有缓存,指向同一个引用
- int和int之间,用==比较,肯定为true。基本数据类型没有equals方法
- int和Integer比较,Integer会自动拆箱,== 和 equals都肯定为true
- int和new Integer比较,Integer会自动拆箱,调用intValue方法, 所以 == 和 equals都肯定为true
Integer和Integer比较的时候,由于直接赋值的话会进行自动的装箱。所以当值在[-128,127]中的时候,由于值缓存在IntegerCache中,那么当赋值在这个区间的时候,不会创建新的Integer对象,而是直接从缓存中获取已经创建好的Integer对象。而当大于这个区间的时候,会直接new Integer。
当Integer和Integer进行==比较的时候,在[-128,127]区间的时候,为true。不在这个区间,则为false
当Integer和Integer进行equals比较的时候,由于Integer的equals方法进行了重写,比较的是内容,所以为trueInteger和new Integer : new Integer会创建对象,存储在堆中。而Integer在[-128,127]中,从缓存中取,否则会new Integer.
所以 Integer和new Integer 进行==比较的话,肯定为false ; Integer和new Integer 进行equals比较的话,肯定为truenew Integer和new Integer进行==比较的时候,肯定为false ; 进行equals比较的时候,肯定为true
原因是new的时候,会在堆中创建对象,分配的地址不同,==比较的是内存地址,所以肯定不同装箱过程是通过调用包装器的valueOf方法实现的
拆箱过程是通过调用包装器的xxxValue方法实现的(xxx表示对应的基本数据类型)总结:Byte、Short、Integer、Long这几个类的valueOf方法实现类似的。所以在[-128,127]区间内,==比较的时候,值总是相等的(指向的是同一对象),在这个区间外是不等的。
而Float和Double则不相等, Boolean的值总是相等的
最新文章
- ESLint 规则
- knockoutJS学习笔记06:ko数组与模板绑定
- win下命令行替代品Cmder
- 省市二级联动(原生JS)
- git clone 失败问题解决方案
- ls常用参数
- POJ 4047 Garden 线段树 区间更新
- 软件工程 speedsnail 冲刺5
- smarty第一天
- delphi 博客地址收藏
- Ubuntu 查看文件以及磁盘空间大小命令df
- 关于Windows文件名和路径名的那些事
- 『重构--改善既有代码的设计』读书笔记----Replace Data Value with Object
- 5、第5节课CSS补充和html 标签讲解20150924
- 【Python&;Sort】QuickSort
- angularjs下拉框空白
- 【汇编语言】Win10 安装 DOXBox0.74
- html之css选择器学习
- vue 版本升级配置修改
- 软件工程(GZSD2015)学生博客列表