`

数值包装类的实现原理

    博客分类:
  • java
阅读更多

一,案例情景

     

/** Integer案例**/
      Integer i1 = 128;
      Integer i2 = 128;
      Integer i3 = 127;
      Integer i4 = 127;
      System.out.println(i1 == i2);//false
      System.out.println(i3==i4); //true

  

/** Long案例**/
      Long l1 = 128L;
      Long l2 = 128L;
      Long l3 = -128L;
      Long l4 = -128L;
      System.out.println(l1 == l2);//false
      System.out.println(l3==l4);//true

   

/**Float(Double)案例(形成对比)**/
     Float f1 = 128f;
     Float f2 = 128f;
     Float f3 = 127f;
     Float f4 = 127f;
     System.out.println(f1 == f2);//false
     System.out.println(f3==f4);//false

 二,原理分析

 

    首先 Integer i1 = 127;将基本数据类型赋给包装类,会调用Integer.valueOf(int i)自动装包,转换为包装类对象。同理,将包装类对象赋给基本数据类型也会自动拆包。如果该包装类对象为null,则会出现NullPointerException异常。

    之所以会出现上述结果。因为Byte,Integer,Long对在-128~127之间的数据进行了缓存,如果待转换的数值 i 在该范围了则直接从缓存取,而不是new Integer(i)。

    Float和Double则是每次都new一个新的,没有缓存机制,所以都为false。

 

JDK源码:

  

/**Integer的实现**/
 public static Integer valueOf(int i) {
        if(i >= -128 && i <= IntegerCache.high)
            return IntegerCache.cache[i + 128];//IntegerCache.high为127,取缓存
        else
            return new Integer(i);
    }
/**Long的实现**/
  public static Long valueOf(long l) {
	final int offset = 128;
	if (l >= -128 && l <= 127) { // will cache
	    return LongCache.cache[(int)l + offset];
	}
        return new Long(l);
    }
/**Float的实现(无缓存)**/
  public static Float valueOf(float f) {
        return new Float(f);
    }

 

 

分享到:
评论

相关推荐

    Java包装类原理与用法实例分析

    Java包装类原理与用法实例分析 Java包装类是Java语言中的一种特殊的类,它可以将基本数据类型转换成对象,以便在面向对象的编程中使用。在Java中,基本数据类型包括byte、short、int、long、float、double、boolean...

    Java中的自动装箱与拆箱:深入理解基本数据类型与对象的转换

    - **自动拆箱实现**:当需要将包装类对象转换为基本数据类型时,编译器会调用包装类中的特定方法(如`intValue()`、`doubleValue()`等)来获取基本数据类型的值。 #### 自动装箱和拆箱的应用 自动装箱和拆箱在多个...

    Boykov 和 Kolmogorov 对最大流/最小切割算法的 MATLAB 包装器:与动态切割的接口

    MATLAB是一种广泛使用的编程环境,特别适合数值计算和数据分析。将Boykov-Kolmogorov算法封装在MATLAB中,使得研究人员和工程师能够方便地在MATLAB环境中解决最大流/最小割问题,而无需深入学习底层的C++或其它低级...

    行业分类-外包设计-塑料管自动计数包装机的说明分析.rar

    工作流程大致为:塑料管由进料输送装置均匀送入,通过计数机构进行实时计数,当达到预设的计数值时,分拣装置将塑料管分组并送至包装位置,包装装置迅速完成封装,最后由控制系统协调各个部件的工作,确保整个过程...

    V20-Java笔记整理-重要概念和常见陷阱梳理.docx

    - **包装类转换为基本数值类型**:使用包装类的`xxxValue()`方法。 - **字符串转换为包装类**:使用包装类提供的`valueOf(String s)`方法。 - **包装类转换为字符串**:使用`toString()`方法。 - **字符串转换为基本...

    基于MATLAB的自动烫金机连杆机构运动的数值分析.zip

    自动烫金机是一种广泛应用在印刷行业的设备,主要用于在各种包装材料上烫印金色或银色等金属效果的图案,提升产品外观的高档感。本文将深入探讨如何利用MATLAB进行自动烫金机连杆机构的运动分析,从而实现精准、高效...

    台达编程技巧

    - **原理**:通过INC和DEC指令实现数值的加减操作,实现微调。 3. **NEG位移反转控制(7.3)** - **应用场景**:位移方向的控制。 - **原理**:使用NEG指令实现位移方向的反转。 #### 八、应用指令旋转位移设计...

    基于MATLAB_GUI的非线性包装系统破损边界计算软件设计.pdf

    此外,通过封装在GUI内的MATLAB程序,可以实现对数据的高效处理和计算,为包装系统设计提供了可靠的技术支持。 综上所述,本文介绍的非线性包装系统破损边界计算软件的设计,不仅涵盖了理论研究和实际应用,还包括...

    用友Nc开发的基础入门

    - **以`UF`开头的控件** (`UFDate`, `UFDouble`, `UFBoolean`, 等): 这些控件主要用于数据输入和展示,例如日期选择器、数值输入框、布尔值选择器等。 ##### 2. 参照 - **`UIRefPane`**: 用于创建各种参照选择面板...

    利用 Python 实现 KNN 算法

    在 Python 中,我们可以使用 NumPy 库来处理数值计算,Pandas 库来处理数据集,Matplotlib 库进行数据可视化,而 Scikit-learn 库则提供了预包装的 KNN 模型。以下是实现 KNN 算法的一般步骤: 1. **数据预处理**:...

    基于单片机技术的硬币分类计数系统设计.pdf

    设计还考虑到了系统的可扩展性,例如在未来可以扩展鉴别硬币真假和自动包装的功能,进一步提升自动化水平,减少人工干预,提高效率。 9. 硬件开发与软件编程 系统涉及的硬件开发包括电路设计、传感器集成以及机械...

    java封装类的作用

    在JDK 5.0之后,Java引入了自动装箱和拆箱机制,使得开发者能够更便捷地处理基本类型和它们对应的包装类。例如: ```java // 装箱 Integer a = new Integer(1); // 拆箱 int b = a.intValue(); ``` 在早期版本中,...

    Java面经.适用于校招

    2.14 LIST、ArrayList、LinkedList和Vector的区别和实现原理 - List接口提供了有序集合的操作。 - ArrayList基于动态数组实现,适合随机访问。 - LinkedList基于双向链表实现,适合插入和删除操作。 - Vector是同步...

    jsp第三章 Java语言程序设计

    本章主要介绍Java语言的基础知识,包括程序的基本构成要素、数据类型、运算符、数值计算方法、表达式、包装类、输入输出初步、流程控制以及数组和字符串的使用。 3.1 Java语言程序的基本构成要素 3.1.1 标识符 在...

    行业分类-外包设计-自动包装机的计数传送装置的介绍分析.rar

    下面我们将深入探讨自动包装机计数传送装置的工作原理、组成部分、优势以及其在实际应用中的技术要点。 自动包装机的计数传送装置主要由以下几个部分组成: 1. **进料系统**:这是设备的初始阶段,负责将待包装的...

    2014年Java最全面试题以及答案.

    可以使用Character类的getNumericValue方法或者通过包装类(如Integer.parseInt)来转换。 23. 如何将数字转换为字符? 数字可以通过String类的静态方法valueOf转换成字符串,再使用charAt方法取得特定位置的字符。...

    Java 33道面试题.docx

    这些包装类允许我们将基本类型转换为对象,便于进行一些高级操作,如比较、格式化输出等。 了解并熟练掌握这些Java基础知识对于成为一名合格的Java开发者至关重要,特别是在面试过程中,能够清晰地阐述这些概念和...

    最全面的JAVA面试题,带答案

    - 自Java 5起,引入了自动装箱和拆箱机制,使得基本类型和其包装类之间可以自动转换,但要注意装箱后的对象比较会涉及到引用比较而非值比较。 8. **自动装箱与拆箱**: - 当基本类型与包装类型之间进行操作时,...

    java面试50题.pdf

    Integer是其对应的包装类,可以作为对象使用,支持一些额外的操作,如自动装箱/拆箱。 6. **char型变量存储中文**:在Java中,char类型可以存储Unicode编码,因此可以存储中文字符。 7. **最有效率的计算2乘以8**...

    JAVA实验指导书

    - 学习如何使用包装类进行数值类型的转换。 **实验内容:** - 学习异常处理的基本语法,包括try、catch、finally等关键字的使用。 - 实践自定义异常的创建和抛出。 - 使用包装类进行基本数据类型与字符串之间的转换...

Global site tag (gtag.js) - Google Analytics