2015070201 - EffactiveJava笔记 - 第49条 基本类型优于装箱类型(2)
2015-07-02 08:13
369 查看
基本数据类型只有数值,而装箱类型则具有与他们的值不同的同一性.换个说法,两个装箱类型可以具有相同的值和不同的同一性.
案例:
回想比较器compare方法返回值是负数,0,还是整数,要取决于它的第一个参数是小于,等于,大于第二个参数.
<script src="https://code.csdn.net/snippets/730317.js"></script>
上面案例,被设计用来表示Integer值的递增数字序列.
严重的缺陷就是naturalOrder.compare(new Integer(2), new Integer(2)),预期效果是0,实际却返回1.,表明第一个数值大于第二个数值.
问题出自何处呢?问题分析.
1.naturalOrder,对表达式first < second执行的是拆箱操作,提取基本数据进行比较,如果答案不成立,进行后续操作.
2.执行计算表达式first ==second,在对象引用的同一性上进行比价,如果first和second引用表示同一个int值,不同内存地址的Integer实例,操作就会返回false,表示第1个值,大于第2个值.
对基本数据类型的包装类型运用 == 操作符总是错误的行为.
<script src="https://code.csdn.net/snippets/730318.js"></script>
那么如何解决这个问题呢?
根本思路不进行同一性比较,即只进行数值比较,不进行对象之间的地址比较.
案例:
回想比较器compare方法返回值是负数,0,还是整数,要取决于它的第一个参数是小于,等于,大于第二个参数.
<script src="https://code.csdn.net/snippets/730317.js"></script>
上面案例,被设计用来表示Integer值的递增数字序列.
严重的缺陷就是naturalOrder.compare(new Integer(2), new Integer(2)),预期效果是0,实际却返回1.,表明第一个数值大于第二个数值.
问题出自何处呢?问题分析.
1.naturalOrder,对表达式first < second执行的是拆箱操作,提取基本数据进行比较,如果答案不成立,进行后续操作.
2.执行计算表达式first ==second,在对象引用的同一性上进行比价,如果first和second引用表示同一个int值,不同内存地址的Integer实例,操作就会返回false,表示第1个值,大于第2个值.
对基本数据类型的包装类型运用 == 操作符总是错误的行为.
<script src="https://code.csdn.net/snippets/730318.js"></script>
那么如何解决这个问题呢?
根本思路不进行同一性比较,即只进行数值比较,不进行对象之间的地址比较.
相关文章推荐
- JAVA对象创建的过程(简单粗暴明了)
- Java堆分析
- Vijava 学习笔记之(Cluster 关联资源信息:CPU、内存、Datastore容量信息)
- java 半角全角互相转换
- Vijava 学习笔记之(虚拟机可扩容CPU核数、内存大小和关联DataStore)
- ftp上传下载 java FTPClient (zhuan)
- eclipse常用快捷键
- JAVA设计模式之原型模式
- [转载] java多线程学习-java.util.concurrent详解(一) Latch/Barrier
- [转载] java多线程学习-java.util.concurrent详解(二)Semaphore/FutureTask/Exchanger
- JAVA中sleep() 和 wait() 有什么区别?
- [转载] java多线程学习-java.util.concurrent详解(三)ScheduledThreadPoolExecutor
- Spring学习(2)
- [转载] Java学习之Hessian通信基础
- 2015070110 - java bin下的命令解释
- Java容器:HashMap和HashSet解析
- java设计模式之建造者模式
- 2015070108 - EffactiveJava笔记 - 第49条 基本类型优于装箱类型(1)
- Java读取带有BOM的UTF-8文件乱码原因及解决办法
- [Java]学习笔记,随笔【八】