java记录

1. 包装类与自动装箱问题:在justjavac的博客上看到翻译的一篇文章 离开java,寻找更佳语言的十大理由 中关于自动装箱的一个描述:

这个特性是为了解决因原生类型的存在所导致的问题,在Java5引入的。它允许静默地转换原生类型到相应的对象,但这常常导致其它的问题。 比如Integer可以为null,但int不能,因此这时JVM只能抛出一个难以调试的空指针异常(NullPointerException). 此外,它还可能导致其它奇怪的行为,就像下面的例子,我们就很难理解,变量test为什么是false:

Integer a = new Integer(1024);

Integer b = new Integer(1024);

boolean test = a < b || a == b || a > b;

昨晚看到这里,一时想不开,咦,为什么是false? 第二天搜了一下,终于想明白了,">""<"都能根据值来判断,那么当然是false,那么照道理说a==b应该是true啦。

但问题就出在这里,两个变量都是对象,对象的 == 只有当两者指向同一个对象时(且hashcode相等?)才算true。两者又是new的,尽管如果基本类型值如果在-128~127的话还是为true的,但是当超过范围,那么又是另外一个问题了。

面试的时候遇到过的一道面试题(尽管在后面工作中也没用到。)

其原理:

在自动装箱时对于值从–128到127之间的值,它们被装箱为Integer对象后,会存在内存中被重用(-128 到 127 缓存) JDK5.0后才有的特性

比较一个int跟Integer时 == 是先将integer的intValue方法得到value属性(int)来比较

举例:

Integer i = 123;

Integer j = 123;

i==j;//true,当数值超出-128~127时,为false

 

 

 

 

posted @   Dont  阅读(159)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示