热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

好程序员Java培训分享int和Integer的区别

好程序员Java培训分享int和Integer的区别,在说int和Integer的区别之前,先要弄清楚两个问题:一、Java基本数据类型及其封装

   好程序员Java 培训分享int Integer 的区别, 在说int Integer 的区别之前,先要弄清楚两个问题:

  一、Java基本数据类型及其封装类

  二、Java自动拆箱和自动装箱

  Java自动拆箱和自动装箱

  1 、自动装箱

  自动装箱其实就是将基本数据类型转换为引用数据类型(对象)

  2 、自动拆箱

  自动拆箱其实就是将引用数据类型转化为基本数据类型

  int  和  Integer 的区别

  分析

  int

  Integer

  int  与  Integer  的区别

   相同值下的 int  和  Integer  的比较结果

  分析

  int

  int  Java的基本数据类型。

  Integer

  Integer  继承了 Object 类,是对象类型,是  int  的包装类。

  int  与  Integer  的区别

  值的存储

  int  存储在栈中

  Integer  对象的引用存储在栈空间中,对象的数据存储在堆空间中。

  初始化

  int  初始化值为 0

  Integer  初始化值为 null

  传参

  int  是值传递,栈中的数据不可变。

  Integer  对象是引用传递,引用不可变,但是引用指向的堆空间地址中的值是可以改变的。

  泛型支持

   泛型不支持int ,但是支持 Integer

  运算

  int  可以直接做运算,是类的特性。

  Integer  的对象可以调用该类的方法,但是在拆箱之前不能进行运算,需要转化为基本类型 int

  int 是基本数据类型, Integer 是引用数据类型;

  int 默认值是 0 Integer 默认值是 null

  int 类型直接存储数值, Integer 需要实例化对象,指向对象的地址。

   相同值下的 int  和  Integer  的比较结果

   两个通过new 生成的变量,结果为 false

  int  和  Integer  的值比较,若两者的值相等,则为 true

   (注意:在比较时,Integer 会自动拆箱为 int 类型,然后再做比较。)

  new  生成的 Integer 变量 和 非 new  生成的 Integer 变量比较,,结果为 false

   (注意:new  生成的 Integer 变量的值在堆空间中,非 new  生成的 Integer 变量的值在在常量池中。)

   (注意:非new 生成的 Integer 变量,会先判断常量池中是否有该对象,若有则共享,若无则在常量池中放入该对象;也叫享元模式,后面再说。)

   两个非new  生成的 Integer 对象比较,则结果为 true

   (注意:此处需要一个前提:值的范围在 -128 ~ 127  之间。

  涉及到Java  int  与  Integer  的自动装箱和拆箱的一种模式:享元模式— flyweight ,为了加强对简单数字的重复利用。

   在赋值时,其实是执行了Integer valueOf() 方法。

   当值在 -128 ~ 127 之间时,Java 会进行自动装箱,然后会对值进行缓存,如果下次再有相同的值,会直接在缓存中取出使用。缓存是通过Integer 的内部类 IntegerCache 来完成的。

   当值超出此范围,会在堆中new 出一个对象来存储。

  PS :自动装箱与拆箱是在 JDK1.5 中出现的。

  )

   内部类IntegerCache

  通过此类可以缓存简单数字。

   缓存的数大小可以由 -XX AutoBoxCacheMax =  控制。

  jvm 初始化时,Java.lang.Integer.IntegerCache.high 属性可以设置并保存在私有系统属性中。

   规定了low 属性的值: -128

  来看个例子

好程序员Java培训分享int和Integer的区别

  1 a == b  吗? 废话,肯定不相等。两个 new 出来的对象地址不一样。

  2 c == d  吗? 这个也是废话,都是基本数据类型的值肯定相等。

  3 :现在的关键问题是  e == f  吗?  g == h  吗?

   答案是:e == f; g != h 。为什么会出现这种情况 ? 因为 ava 在进行编译时  Integer g = 130 会被编译成  Integer.valueOf(130)  ,这个可以通过反编译 class 文件看到。而通过 Integer 源码可以得出, Integer.valueOf()  方法会在数值 -128~127 之间会对 Integer 进行缓存,不会再重新 new 一个,所以  e==f  ;当数值二大于 127 或者小于 -128 的时候则会重新 new 一个,所以 g != h 

  Integer valueOf 方法如下

好程序员Java培训分享int和Integer的区别

  4 c == e  吗,  i == j  吗?

  答案都是相等的。因为封装类和基本数据类型进行比较的时候,Java 会自动拆箱,然后比较数值是  否相等。

  综上,我们可以得出几个结论:

  1 、都是封装类,都是 new 出来的,肯定不相等。因为对象的内存地址不一样。

  2 、都是封装类,都不是 new 出来的,如果值在 -128~127 之间,那就相等,否则不相等。

  3 、如果是封装类和基本类型进行比较,只要数值相等那就相等,否则就不相等。因为封装类和基本数据类型进行比较的时候会有一个自动拆箱操作。

  4 、都是基本数据类型,如果数值相等,那就相等;否则不相等。


推荐阅读
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • 如何搭建Java开发环境并开发WinCE项目
    本文介绍了如何搭建Java开发环境并开发WinCE项目,包括搭建开发环境的步骤和获取SDK的几种方式。同时还解答了一些关于WinCE开发的常见问题。通过阅读本文,您将了解如何使用Java进行嵌入式开发,并能够顺利开发WinCE应用程序。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • Java和JavaScript是什么关系?java跟javaScript都是编程语言,只是java跟javaScript没有什么太大关系,一个是脚本语言(前端语言),一个是面向对象 ... [详细]
  • 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件
    本文旨在全面介绍Windows内存管理机制及C++内存分配实例中的内存映射文件。通过对内存映射文件的使用场合和与虚拟内存的区别进行解析,帮助读者更好地理解操作系统的内存管理机制。同时,本文还提供了相关章节的链接,方便读者深入学习Windows内存管理及C++内存分配实例的其他内容。 ... [详细]
  • 深入理解Java虚拟机的并发编程与性能优化
    本文主要介绍了Java内存模型与线程的相关概念,探讨了并发编程在服务端应用中的重要性。同时,介绍了Java语言和虚拟机提供的工具,帮助开发人员处理并发方面的问题,提高程序的并发能力和性能优化。文章指出,充分利用计算机处理器的能力和协调线程之间的并发操作是提高服务端程序性能的关键。 ... [详细]
  • Mono为何能跨平台
    概念JIT编译(JITcompilation),运行时需要代码时,将Microsoft中间语言(MSIL)转换为机器码的编译。CLR(CommonLa ... [详细]
  • 初识java关于JDK、JRE、JVM 了解一下 ... [详细]
  • 微信公众号:内核小王子关注可了解更多关于数据库,JVM内核相关的知识;如果你有任何疑问也可以加我pigpdong[^1]jvm一行代码是怎么运行的首先,java代码会被编译成字 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了在Android开发中使用软引用和弱引用的应用。如果一个对象只具有软引用,那么只有在内存不够的情况下才会被回收,可以用来实现内存敏感的高速缓存;而如果一个对象只具有弱引用,不管内存是否足够,都会被垃圾回收器回收。软引用和弱引用还可以与引用队列联合使用,当被引用的对象被回收时,会将引用加入到关联的引用队列中。软引用和弱引用的根本区别在于生命周期的长短,弱引用的对象可能随时被回收,而软引用的对象只有在内存不够时才会被回收。 ... [详细]
  • DSP中cmd文件的命令文件组成及其作用
    本文介绍了DSP中cmd文件的命令文件的组成和作用,包括链接器配置文件的存放链接器配置信息、命令文件的组成、MEMORY和SECTIONS两个伪指令的使用、CMD分配ROM和RAM空间的目的以及MEMORY指定芯片的ROM和RAM大小和划分区间的方法。同时强调了根据不同芯片进行修改的必要性,以适应不同芯片的存储用户程序的需求。 ... [详细]
  • Python中sys模块的功能及用法详解
    本文详细介绍了Python中sys模块的功能及用法,包括对解释器参数和功能的访问、命令行参数列表、字节顺序指示符、编译模块名称等。同时还介绍了sys模块中的新功能和call_tracing函数的用法。推荐学习《Python教程》以深入了解。 ... [详细]
author-avatar
mobiledu2502909783
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有