java记录
2024-10-13 16:26:56
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
最新文章
- 窥探Swift之基本数据类型
- Net环境下比较流行的ORM框架对比
- ASP.NET常用函数(参考用)
- ubuntu12.04下一个简单的conky安装
- Linux下开发常用 模拟 Http get和post请求
- RDS记录
- AT&;T ASSEMBLY FOR LINUX AND MAC (SYS_FORK)
- 重新想象 Windows 8 Store Apps (37) - 契约: Settings Contract
- 微信第一个“小程序”亮相:不是APP胜似APP!
- postgre去重复记录
- go安装windows源码
- 单源最短路径的Bellman-Ford 算法
- 转】MyEclipse使用总结——设置MyEclipse使用的Tomcat服务器
- CMSIS Example - osMutex osMutexWait osMutexRelease
- 【js】js方法中直接跳转到servlet
- 彻底搞清js中闭包(Closure)的概念
- Selenium WebDriver + Grid2 + RSpec之旅(四) ----通过RSpec编写测试用例
- hdu1520 第一道树形DP,激动哇咔咔!
- wireshark 过滤条件汇总
- hiho 1015 KMP