1.通常情况下,两个包装类型只有在两个引用指向同一对象时,使用 == 进行比较时才会返回true

例如:

Double do1 = Double.valueOf(1.23);
Double do2 = Double.valueOf(1.23);
System.out.println(do1 == do2);
//输出false,do1和do2指向两个不同的对象
Double do3 = do1;
System.out.println(do3 == do1);
//输出true,do3指向和do1同样的对象

可以把包装类当作普通类来看待,只是它们的创建方式比较特殊。

2.特殊情况:Integer类中,数值范围在-128~127时,装箱/自动装箱产生的同值的Integer对象是同一对象

java.lang.Integer中的代码

//创建一个static final 的Integer类型的数组,长度为256
static final Integer[] cache = new Integer[-(-128)+127+1];
//执行static初始化块,初始化数组,数组元素为Integer类型的-128~127
static{for(int i = 0;i < cache.length; i++){cache[i] = new Integer(i-128);}
}

因为java.lang包自动加载,Integer类自动加载,而这个static的cache数组也就会自动创建。因此在虚拟机启动后,就已经存在从-128~127的Integer对象了。

如果装箱/自动装箱,产生的该范围内Integer类型的变量,都将只是指向cache数组某一元素的引用;

如果使用new关键字创建-128~127范围内的Integer对象,则将会在堆内存中重新创建Integer对象,自然与cache数组中的对应对象为不同对象,使用==运算符时,返回false。

因此会有如下结果:

var it1 = new Integer(127);
var it2 = new Integer(127);
System.out.println(it1 ==it2);  //输出false
System.out.println(Integer.valueOf(127) == it1);  //输出false
System.out.println(Integer.valueOf(127) == Integer.valueOf(127));  //输出true

3.书中错误:

《java疯狂讲义第5版》170页:

这个很明显是粗心大意造成的错误,这是不严谨的,但对于初学者(比如我)来说,可能会带来疑惑。如果读者因为懒惰不加以验证,就会种下错误的种子。

还望作者在编写时能更加严谨,读者在困惑时大胆尝试,实践出真理。

在此感谢本书作者李刚老师,您的《java疯狂讲义》在我入门java语言的初始阶段给了我莫大的帮助,多谢!

尽信书,不如无书。java的包装类Integer的深入理解及特殊情况(以及java疯狂讲义第5版170页中的错误)相关推荐

  1. 尽信书则无书,开卷有益!

    最近比较喜欢工程师们叙述自己的经历和总结,因为做技术的大部分工作其实都是类似的,所以更加容易去体会作者的感受和想法,所以最近看到这篇文章,有些观点不同的人可能认可程度不同,不过总会有一定的借鉴意义,推 ...

  2. java疯狂讲义第四版第五章答案_疯狂java讲义第五章笔记

    1 定义类,成员变量和方法 类和对象 定义类 java的类名由一个或者多个有意义的单词组合而成,每个单词的首字母大写,其他的全部消协,并且单词之间没有分隔符. 成员变量:用于定义该类或者实例的所包含的 ...

  3. java int和integer的区别_int和Integer的区别

    int和Integer的区别 1.Integer是int的包装类,int则是java的一种基本数据类型 2.Integer变量必须实例化后才能使用,而int变量不需要 3.Integer实际是对象的引 ...

  4. java Interger包装类不能使用“==“判断值相等

    今天看到朋友发的一个 面试题 我将代码拷贝到编译器后第一反应是idea提醒不能使用 "= ="去判断并且提示将"=="置换为equal()方法. 看到这个想起来 ...

  5. 尽信书则不如无书、尽信标准则不如无标准(也谈JM8.6代码中的手误)

    看代码时,无意看到了JM8.6中的两个手误,虽然不影响程序,但还是揪出来看看长什么样. 在start_sequence的注释中,单词alternative写成了alterbative,这个很容易理解, ...

  6. 尽信书不如无书之获取枚举值代码优化

    1 背景 实际开发中根据枚举的某个属性获取枚举值非常常见. 如定义一个枚举: @Getter public enum CoinEnum {PENNY(1), NICKEL(5), DIME(10), ...

  7. 诺大一个中国,却无书可读

    在论坛里,经常看到有些网友说中国的游戏开发别的都不缺,就缺好的创意策化.其实,中国游戏开发什么都缺,游戏程序设计开发,美工,3D,AI都很落后. 目前国外流行的都是3D游戏(如半条命2),开发该类游戏 ...

  8. java犀牛书_犀牛书学习笔记(1):语法结构、数据类型和值、表达式和运算符...

    把这三个部分写在一起,是因为这些和JAVA几乎相同,如果你有JAVA或者C的基础,可以快速阅读.这里只记录几个不一样的,需要记住的地方: 1.直接量概念:其实就是用具体值直接赋值来创建变量,比如&qu ...

  9. Linux socket accept尽信书不如无书

    关于Linux socket 里面的   int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen)函数,很多书籍都把第三个参数 ...

最新文章

  1. 留不住客户?该从你的系统上找找原因了
  2. python项目-这4个Python实战项目,让你瞬间读懂Python!
  3. .dat数据文件怎么打开_U盘坏了怎么恢复数据?恢复数据的方法
  4. NLP之情感分析:基于python编程(jieba库)实现中文文本情感分析(得到的是情感评分)之全部代码
  5. Python 使用穷举法求两个数的最大公约数。
  6. python(matplotlib5)——Contours 等高线图
  7. 来自褪墨:个人回顾与展望/2011年的回顾和对2012年的计划
  8. 电脑操作系统维护10条实用建议!
  9. python wait_Python的等效Java函数wait(),notify(),synchronized
  10. C++ 使用模板需要注意的事情
  11. 智能会议系统(6)---高效视频会议系统
  12. 【Java】Java8 LocalDate日期时间用法总结
  13. HDU1722 Cake【GCD】
  14. 直觉模糊有计算机知识嘛,多源直觉模糊信息系统的知识获取方法
  15. 面向对象编程 --- 反射
  16. 第一章 数字图像基础知识(图像的空间分辨率和幅度分辨率)
  17. oracle双活svc,基于SVC的三种主流双活数据中心架构深入探讨
  18. mysql 中average_MySQL Average()
  19. 计算机视频的压缩方式,电脑压缩视频的方法图解步骤
  20. Mac下将ISO写入U盘镜像

热门文章

  1. STM32基础(11)ADC模数转换
  2. 海量数据大课学习笔记(6)-短链平台项目创建+git代码管理+开发分层规范讲解--小滴课堂
  3. 杰理之download加key会报错(无效的key文本)的解决办法【篇】
  4. wordpress 插件的开发 入门
  5. FL Studio21傻瓜式编曲音乐编辑器FL水果软件
  6. (7月30号开班)Python爬虫小分队和数据分析小分队招募
  7. 完美解决win10不认移动硬盘和U盘的问题
  8. Sql Server 2008卸载后再次安装一直报错
  9. 软件项目管理作业(一):如何学好项目管理课程
  10. 百度文库文档(文字和图片)