第一,简介

int是java的8个原始数据类型(boolean, byte, short, char, int, float, double, long)之一。java虽然号称一切皆是对象,但原始数据类型除外。

integer是int对应的包装类,它有一个int类型的字段存储数据,并提供了数学运算,int和字符串之间转换等基本操作。在java5中,引入了自动装箱和自动拆箱功能,并新增了静态工厂方法valueof,在调用它的时候回利用一个缓存机制,这个缓存默认值是-128到127之间。所有的包装类都被声明为"private final",所以,它们同样是不可变类型。

第二,知识扩展

1,理解自动装箱,拆箱。自动装箱实际上算是一种语法糖。也就是java为我们自动进行一些转换,保证不同的写法在运行时等价,它们发生在编译阶段,也就是生成的字节码是一致的。javac替我们自动把装箱转换为integer.valueOf(),把拆箱替换为integer.intValue()。这种缓存机制也存在其他一些包装类,比如:Boolean, Short, Byte, Character。

2,自动装箱,拆箱在编码中的注意事项。原则上建议避免无意中的装箱,拆箱行为,尤其是性能敏感的场合,创建10万个java对象和10万个整数的开销可不是一个数量级的,不管是内存使用还是处理速度,光是对象的空间占用就已经是数量级的差距了。使用原始数据类型,数组甚至本地代码实现等,在性能极度敏感的场景往往具有比较大的优势,用其替换掉包装类,动态数组(如ArrayList)等可以作为性能优化的备选项。

3,java原始数据类型和引用类型局限性。首先数据类型和java泛型某种程度上可以算作伪泛型,它完全是一种编译器的技巧,java编译期会自动将类型转换为对应的特定类型,这就决定了使用泛型,必须保证相应类型可以转换为Object。第二,无效高效的表达数据,也不便于表达复杂的数据结构。java对象都是引用类型,如果是一个原始数据类型数组,它在内存里是一段连续的内存,而对象数组是无序的分散在堆的不同位置。这种设计虽然灵活,但也导致了数据操作的低效,尤其是无法充分利用现代CPU缓存机制。

4,原始类型的线性安全问题。原始数据类型的变量,显然要使用并发先关手段,才能保证线程安全。特别是部分比较宽的数据类型,比如float,double,甚至不能保证更新操作的原子性,可能出现程序读取到只更新了一半数据位的数值。如果有线程安全的计算需要,建议考虑使用类似Atomicinteger,AtomicLong这样的线程安全类。

第三,运用场景

1,因为比如Integer i = 128;java在编译Integer i = 128的时候,被翻译成 Integer i = Integer.valueOf(128);所以无论如何,Integer与new Integer不会相等。都不会经历拆箱过程,直接是两个对象的比较。

2,两个都是非new出来的Integer,如果数在-128到127之间,则是true,否则为false,因为valueOf()函数会对-128到127之间的数进行缓存。如果数值在-128到127之间则取缓存对象,否则重新new一个新对象。

3,两个都是new Integer,是两个对象进行比较,比较都为false。

4,int和integer(无论new否)比,都为true,因为会把Integer自动拆箱为int再去比。

举例:

为什么i4和i5比是true,而i6和i7比是false呢?关键就是看valueOf()函数了,这个函数对于-128到127之间的数,会进行缓存, Integer i4 = 127时,会将127进行缓存,下次再写Integer i5 = 127时,就会直接从缓存中取,就不会new了。所以i4和i5比是true,而i6和i7大于127所以都需要new出来所以最后比是false。

java int integer_浅谈java中int和Integer的区别相关推荐

  1. 猿来小课Java视频教程讲师浅谈JAVA体系结构

    猿来小课Java视频教程讲师:Java体系结构中不仅定义了Java的开发编译环境,也定义了Java的运行环境.为运行Java应用程序和applet,计算机上应安装JVM和Java运行时解释器,这两个部 ...

  2. 浅谈 JDBC 中 CreateStatement 和 PrepareStatement 的区别与优劣。

    浅谈 JDBC 中 CreateStatement 和 PrepareStatement 的区别与优劣.

  3. html代码id,浅谈html中id和name的区别实例代码

    浅谈html中id和name的区别实例代码 更新时间:2008年07月28日 23:00:55   作者: 这个是form里面的name与id的区别 我们可以通过一段代码来分析一下其中的微妙差别: 在 ...

  4. 【网摘】 浅谈HTTP中GET与POST的区别

    文章出处:http://www.cnblogs.com/hyddd/archive/2009/03/31/1426026.html 浅谈HTTP中Get与Post的区别 Http定义了与服务器交互的不 ...

  5. scale和java比较_浅谈java中BigDecimal的equals与compareTo的区别

    这两天在处理支付金额校验的时候出现了点问题,有个金额比较我用了BigDecimal的equals方法来比较两个金额是否相等,结果导致金额比较出现错误(比如3.0与3.00的比较等). [注:以下所讲都 ...

  6. java 线程aba,浅谈Java中ABA问题及避免,浅谈javaaba避免

    浅谈Java中ABA问题及避免,浅谈javaaba避免 本文主要研究的是关于Java中ABA问题及避免的相关内容,具体如下. 在<Java并发实战>一书的第15章中有一个用原子变量实现的并 ...

  7. java的throw_浅谈Java的throw与throws

    浅谈Java异常 以前虽然知道一些异常的处理,也用过一些,但是对throw和throws区别还是有不太清楚.今天用实例测试一下 异常处理机制 异常处理是对可能出现的异常进行处理,以防止程序遇到异常时被 ...

  8. c java多态_浅谈Java多态

    什么是Java中的多态?又是一个纸老虎的概念,老套路,把它具体化,细分化,先想三个问题(注意,这里不是简单的化整为零,而是要建立在学习一个新概念时的思考框架): 1.这个东西有什么用?用来干什么的?它 ...

  9. 【Java虚拟机】浅谈Java虚拟机

    跨平台 Java的一大特性是跨平台,而Java是如何做到跨平台的呢? 主要依赖Java虚拟机,具体来说,是Java虚拟机在各平台上的实现. Java虚拟机在不同的平台有不同的实现.同一份字节码,通过运 ...

  10. java 虚拟机_浅谈Java虚拟机内存区

    1. Java 虚拟机内存区概述 我们在编写程序时,经常会遇到OOM(out of Memory)以及内存泄漏等问题.为了避免出现这些问题,我们首先必须对JVM的内存划分有个具体的认识.JVM将内存主 ...

最新文章

  1. 如何优雅的实现 try/catch 异常块?
  2. 如何不编程,采集网站评论信息?(视频教程)
  3. oracle中directory的使用
  4. jzoj2152-终极数【堆】
  5. java 调用foxmail_java邮件收发功能实现代码
  6. python降维可视化 自编码_deep learning 自编码算法详细理解与代码实现(超详细)...
  7. c语言mpi矩阵乘法,【MPI并行程序】矩阵乘法
  8. 游戏筑基之位操作及预处理命令(C语言)
  9. NRF52840-QIAA-R Nordic BLE5.0蓝牙无线收发芯片
  10. X264码率控制总结——ABR,CQP,CRF
  11. 联想P340加显卡白屏,降级BIOS恢复正常。
  12. 火车进出栈【卡特兰数】【高精度】【压位】【压int位】
  13. vscode设置豆沙绿护眼色
  14. 【Unity项目实战】手把手教学:飞翔的小鸟(3)动画制作
  15. 平凡的人,做不平凡的事
  16. 语c语言描写,1:语c是什么.还有一些常识.(?)
  17. 程序员笑话常客:“rm -rf *“和 “rm -rf /*“的区别
  18. Echarts绘制地图,且可以下钻到省区
  19. 北京时间和格林威治时间互相转化 JavaScript
  20. 软件项目管理第4版课后习题-期末复习题型分册版-带答案

热门文章

  1. java 原型模式_原型模式
  2. mybaits.xml文件约束,头部
  3. flask与js交互的示例代码_用Python做交互式图形
  4. jtds 连接mysql_JAVA 使用jtds 连接sql server数据库
  5. vue-cli 做前端+ nodejs做服务端的 IIS部署
  6. LeetCode 981.基于时间的键值存储(C++)
  7. IntelliJ IDEA安装lombok
  8. iOS 网络与多线程--3.异步Get方式的网络请求(非阻塞)
  9. AnsiString用法(转)
  10. 误删除libc.so.6的解决方法