`

Integer类认识

阅读更多
Integer类有一个缓存,他会缓存介于-128-127之间的整数。
首先看一段代码(使用JDK 5),如下:

 
  
public class Test { 
  public static void main(String[] args) { 
    Integer i1 = 127; 
    Integer i2 = 127; 

    if (i1 == i2) 
      System.out.println("Equal!"); 
    else 
      System.out.println("Not equal!"); 
  } 
} 



    输出结果想必大家也知道,是“Equal!”。现在把i1和i2的值由127改为128看看会发生什么?结果输出“Not equal!”。
    这个问题的答案看了下面的就会清楚了。

   为了更容易理解问题,用Jad将上面代码反编译,如下:
Java代码 复制代码

 
  import java.io.PrintStream;    
      
   public class Test    
   {    
      
        public Test()    
        {    
       }    
      
       public static void main(String args[])    
      {    
           Integer i1 = Integer.valueOf(128);    
           Integer i2 = Integer.valueOf(128);    
           Integer i3 = Integer.valueOf(128);    
    
           if(i1 == i2)    
               System.out.println("i1 == i2 is true!");    
           else    
               System.out.println("i1 == i2 is false!");    
     
           if(i1.intValue() >= i2.intValue())    
               System.out.println("i1 >= i2 is true!");    
           else    
              System.out.println("i1 >= i2 is false!");    
     
          if(i1 == i3)    
              System.out.println("i1 == i3 is true!");    
           else    
               System.out.println("i1 == i3 is false!");    
      }    
   }   


Java代码  收藏代码

   
import java.io.PrintStream;   
      
    public class Test   
   {   
      
       public Test()   
       {   
        }   
     
       public static void main(String args[])   
       {   
         Integer i1 = Integer.valueOf(128);   
           Integer i2 = Integer.valueOf(128);   
           Integer i3 = Integer.valueOf(128);   
     
           if(i1 == i2)   
               System.out.println("i1 == i2 is true!");   
           else   
               System.out.println("i1 == i2 is false!");   
    
         if(i1.intValue() >= i2.intValue())   
               System.out.println("i1 >= i2 is true!");   
          else   
              System.out.println("i1 >= i2 is false!");   
     
           if(i1 == i3)   
               System.out.println("i1 == i3 is true!");   
           else   
               System.out.println("i1 == i3 is false!");   
       }   
  }   

import java.io.PrintStream; 

public class Test 
{ 

    public Test() 
    { 
    } 

    public static void main(String args[]) 
    { 
        Integer i1 = Integer.valueOf(128); 
        Integer i2 = Integer.valueOf(128); 
        Integer i3 = Integer.valueOf(128); 

        if(i1 == i2) 
            System.out.println("i1 == i2 is true!"); 
        else 
            System.out.println("i1 == i2 is false!"); 

        if(i1.intValue() >= i2.intValue()) 
            System.out.println("i1 >= i2 is true!"); 
        else 
            System.out.println("i1 >= i2 is false!"); 

        if(i1 == i3) 
            System.out.println("i1 == i3 is true!"); 
        else 
            System.out.println("i1 == i3 is false!"); 
    } 
} 



   从这可以看出,“Integer i1 = 127;”在JDK1.5下应该编译成了“Integer i1 = Integer.valueOf(127);”。



    再看看java.lang.Integer中关于valueOf的源代码是怎样的:


Java代码

 
 public static Integer valueOf(int i) {    
     final int offset = 128;    
     if (i >= -128 && i <= 127) { // must cache    
       return IntegerCache.cache[i + offset]; //这个主意下,Cache 缓存了-128~127的值   
      }    
      return new Integer(i);    
   }   

Java代码  收藏代码

 
 public static Integer valueOf(int i) {   
      final int offset = 128;   
     if (i >= -128 && i <= 127) { // must cache   
        return IntegerCache.cache[i + offset]; //这个主意下,Cache 缓存了-128~127的值  
     }   
      return new Integer(i);   
    }   

  public static Integer valueOf(int i) { 
    final int offset = 128; 
    if (i >= -128 && i <= 127) { // must cache 
      return IntegerCache.cache[i + offset]; //这个主意下,Cache 缓存了-128~127的值
    } 
    return new Integer(i); 
  } 




   可以看出,这个值在-128到127之间,会将其cached(缓存)起来,如果多次使用的话,会节省内存和改善性能;如果不在这个范围之内,则生成一个新的Integer Object instance,这样如果进行“==”时,由于是比较两个不同的Object references,故结果是false。事实上,这个特性从JDK 1.3就存在了(以前的我不清楚) 。

    确切的说,上面出现的问题实质并不是Autoboxing和Auto-Unboxing,应该是Integer类的valueOf(int i)方法,只是Autoboxing和Auto-Unboxing将这个问题掩盖了。
分享到:
评论

相关推荐

    JavaSE_Chaper11_Mark.pdf

    在JavaSE的学习中,了解Java中常用类的使用对于构建一个健壮的应用程序是至关重要的。...这样的实践不仅可以帮助我们掌握如何使用Java提供的常用类,而且还能提升我们对Java面向对象编程范式的认识。

    bounded-integer:旨在替换所有内置整数的C ++库

    设计决策到目前为止的情况由于对边界的要求不严格,C ...大多数实现都认识到这一事实,但是尝试通过以检查整数的形式增加较少的开销来解决此问题。它们照常执行算术运算,但是如果结果超出范围,则典型的实现将引发异常

    java类库——中文版

    通过以上知识点,我们可以对Java类库有一个较为全面的了解,特别是对JavaSE6版本提供的类和接口有一个基础的认识。同时,对于使用手册的用户而言,掌握PDF格式的使用技巧和对扫描文字错误的理解和处理也同样重要。

    java总结.docx

    - **int**:32位(4字节),封装类为`Integer` - **long**:64位(8字节),封装类为`Long` - **float**:32位(4字节),封装类为`Float` - **double**:64位(8字节),封装类为`Double` - **char**:16位(2字节...

    零基础认识 Spring Boot.docx

    零基础认识 Spring Boot Spring Boot 是一个基于 Spring 框架的开源框架,旨在简化 Spring 应用的开发过程。它提供了一种快速、灵活和高效的方式来构建生产级应用程序。 新建 Spring Boot 项目 使用 Spring ...

    JAVA课件 辽宁工业大学

    10. **包装类**:JAVA提供了八种基本数据类型的包装类,如Integer、Double等。这部分会讲解如何将基本类型与对象之间相互转换。 通过学习这些内容,初学者不仅能了解JAVA的常用类,还能建立起对JAVA标准库的初步...

    c-面向对象程序设计课程设计报告银行卡管理系统毕设论文.doc

    C++面向对象程序设计课程设计报告银行卡管理系统毕设论文 本文总结了设计一个文字界面的银行卡管理系统,功能...通过本次课程设计,我们提高了自己的编程能力,并更加认识到 C++ 的学习离不开自己平时的练习和实践。

    ASP.NET中的STREAMREADER对象总结

    ### ASP.NET中的STREAMREADER对象总结 #### 一、引言 ...通过本文的详细介绍,相信读者已经对`StreamReader`有了全面的认识。在实际开发中灵活运用这些方法,将有助于提高文件读取操作的效率和稳定性。

    大数的认识打磨后的思维导图.docx

    在编程语言中,处理大数时,有些语言如Python有内置的Big Integer类型,可以无限制地存储和运算大数。而其他一些语言如C++,在默认情况下,整数类型(如int)有大小限制,超过这个限制的数值就会发生溢出,这时需要...

    Java程序设计与实践教程 王薇主编 答案.pdf

    1. Java标准库包含许多系统类,如`Object`是所有类的基类,`Integer.parseInt()`用于将字符串转换为整数。 本书通过判断题、填空题和选择题的形式帮助学习者巩固对Java基础知识的理解,涵盖从基本语法到面向对象...

    java泛型学习

    这意味着在运行时,`List&lt;String&gt;` 和 `List&lt;Integer&gt;` 实际上是同一个类的实例。 - **构造泛型对象的挑战**:当尝试创建泛型对象的副本时,由于类型信息的缺失,通常无法直接使用构造函数或 clone 方法。例如,在...

    5-3面向对象的功能实现.docx

    - 认识并掌握如何在Visual Basic (VB) 中创建类的方法。 - 学会对象的声明及实例化的过程。 - 了解在VB环境下进行面向对象程序设计的一般流程。 2. **过程与方法** - 在VB中实际操作创建与使用类的过程。 - ...

    java实验报告(2)-多态和继承

    **Java实验报告(2)-多态和继承** ...通过这个实验,学习者不仅理解了Java中的继承和多态,还通过实践加深了对这两个概念的认识。这样的实践有助于培养解决问题的能力,为今后的软件开发打下坚实的基础。

    认识SQLite数据库和实列

    db.execSQL("create table " + TABLE_NAME + " (ID INTEGER PRIMARY KEY AUTOINCREMENT,NAME TEXT, MARKS INTEGER)"); } } ``` **例子2:查询与Cursor使用** ```java public List&lt;Student&gt; getAllStudents() { ...

    JAVA经典教材笔记

    - 常用包装类:Integer、Double等。 - **匿名内部类** - 匿名内部类的定义:没有名称的内部类。 - 匿名内部类的应用场景:实现接口或继承抽象类。 #### 第七章:异常的基本概念 - **异常的基本概念** - 异常的...

    XML应用开发(软件品牌)-1期 3.1 课堂实践-认识XML Schema文档结构.doc

    本实践主要涉及对XML Schema文档结构的认识以及如何使用XML Schema进行XML文档的验证。 XML Schema是W3C推荐的一种XML文档的语法规则定义方式,与早期的DTD(Document Type Definition)相比,XML Schema提供了更...

    java泛型详解

    理解泛型的关键在于认识到类型参数(通常用`T`表示,当然也可以是任何合法的标识符)的作用。类型参数充当了一个占位符的角色,用于在具体使用泛型类或接口时指定实际的类型。这一点与方法的形式参数类似——形式...

    head first java

    用Integer.parseInt()转换字符串 习题 6 使用Java函数库 7 对象村的优质生活 8 深入多态 9 对象的前世今生 10 数字很重要 11 有风险的行为 12 看图说故事 13 使用Swing 14 保存对象 15 网络联机 16 数据结构 17 ...

    java 新手小白的入门课

    - **包装类**:Integer、Double等包装类的使用。 - **日期时间API**:Date、Calendar、LocalDate等类的使用。 - **数学类Math**:常用数学函数如sqrt、random等的使用。 - **数组与ArrayList**:数组的定义、初始化...

    Java泛型:概念、用法与优势

    在深入了解Java泛型的具体用法之前,我们需要先对泛型的基本概念有一个清晰的认识。泛型的引入主要是为了解决早期Java编程中遇到的一些问题。例如,在没有泛型的情况下,如果想要创建一个能够处理不同类型数据的集合...

Global site tag (gtag.js) - Google Analytics