`
hz_chenwenbiao
  • 浏览: 1007844 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

C#之int挑战Java之Integer(转)

阅读更多

可能有些图会看不到,可以到转载处去阅读:http://kb.cnblogs.com/page/79961/

 

  本文涉及到一些JVM原理和Java的字节码指令,推荐感兴趣的读者阅读一本有关JVM的经典书籍《深入Java虚拟机(第2版)》,将它与我在《.NET 4.0面向对象编程漫谈》中介绍的CLR原理与IL汇编指令作个对比,相信读者会有一定的启发。而仔细对比两个类似事物的异同,是很有效的学习方法之一。

  今后我还将在个人博客上放出其他的文章,希望能帮助书的读者开拓视野,启发思考,大家一起探讨技术的奥秘。

  本文所述之内容仅代表个人之理解,任何疏漏及错误请直接回贴指出。

  1 奇特的程序输出

  前段时间,一个学生给我看了一段“非常诡异”的Java代码:

public class TestInteger {
    public static void main(String[] args){
        Integer v1=100;
        Integer v2=100;
        System.out.println(v1==v2); //输出:true
        Integer w1=200;
        Integer w2=200;
        System.out.println(w1==w2); //输出:false
    }
}
 让这个学生最困惑的是,为什么这些如此相似的代码会有这样令人意外的输出?

  我平时多使用C#,Java用得不多,初看到这段代码的输出,我也同样非常奇怪:怎么会这样呢?100和200这两个整型数值对Integer这个类有本质上的差别吗?

  为了弄明白出现上述现象的底层原因,我使用javap工具反汇编了Java编译器生成的.class文件:

1

  通过仔细阅读Java编译器生的字节码,我发现以下给Integer变量赋值的语句:

  Integer v1=100;

  实际上调用的是Integer.valueOf方法。

  而完成两个Integer变量比较的以下语句:

  System.Console.WriteLine(v1 == v2);

  实际生成的是if_acmpne指令。其中的a代表“address”,cmp代表“Compare”,ne代表“not equal”。

  这条指令的含义是:比较Java方法栈中的两个操作数(即v1与v2),看看它们是不是指向堆中的同一个对象。

  当给v1和v2赋值100时,它们将引用同一个Integer对象。

  那为什么当值改为200时,w1和w2就“翻脸了”,分别引用不同的Integer对象?

  秘密就在于Integer.valueOf方法。幸运的是,Java的类库是开源的,所以我们可以毫不费力地看到相关的源代码:

public static Integer valueOf(int i){
        if(i >= -128 && i <= IntegerCache.high)
            return IntegerCache.cache[i + 128];
        else
            return new Integer(i);
    }

   一切真相大白,原来Integer在内部使用了一个私有的静态类IntegerCache,此类内部封装了一个Integer对象的cache数组来缓存Integer对象,其代码如下:

private static class IntegerCache {
      static final Integer cache[];
      //……
}
   再仔细看看IntegerCache内部的代码,会看到它使用静态初始化块在cache数组中保存了[-128,127]区间内的一共256个Integer对象。

  当给Integer变量直接赋整数值时,如果这个数值位于[-128,127]内,JVM(Java Virtual Machine)就直接使用cache中缓存的Integer对象,否则,JVM会重新创建一个Integer对象。

  一切真相大白。 

分享到:
评论

相关推荐

    C#程序转Java程序代码转换器.zip

    2. 类型系统:C#支持值类型和引用类型,而Java只有引用类型,但有原始类型(如int)和包装类(如Integer)。 3. 泛型:C#的泛型语法比Java更灵活,Java泛型在使用时有类型擦除。 4. 枚举(enum):C#中的枚举类型比...

    Java与c#语法及对比

    综上所述,Java与C#在语法上有许多相似之处,但也存在一些差异。开发者应根据具体项目的需求和个人偏好来选择使用哪种语言。通过本文的对比,希望能帮助读者更好地理解和掌握这两种语言的特点。

    C#和Java的区别(适合初学者)

    C#中,数字可以直接调用`int.Parse()`或`Convert.ToInt()`转换,Java则需要`Integer.parseInt()`或`String.valueOf()`。 以上是C#和Java在语法、项目结构、字符串处理、注释、代码格式化等方面的一些主要区别。了解...

    Java (J2SE 5.0) and C# Comparison

    在类型转换时,Java需要使用`Integer.toString()`或`Integer.parseInt()`等方法。 - **C#**: C#也有原始类型和引用类型。原始类型包括`bool`, `byte`, `sbyte`, `char`, `short`, `ushort`, `int`, `uint`, `long`,...

    C_C#_VB_Java语法比较总结

    - 整型在所有语言中都存在差异,C++和Java中为int,***中为Integer,C#.net中保留int和Integer两种形式,但int更为常用。 - 短型、长型、单精型、双精型在四种语言中的命名大多类似,只是在C#中存在int与Integer的...

    VB.NET C# 互转 Convert

    例如,`Dim x As Integer` 在C#中是 `int x;` 3. **循环结构**:VB.NET的For...Next和Do...Loop与C#的for和while有对应的转换规则。 4. **事件处理**:VB.NET使用Handles关键字,C#使用事件委托和+=操作符。 5. *...

    vc转C# 互转

    本文将详细介绍如何在VB与C#之间进行代码转换,并探讨这一过程中的挑战与解决方案。 #### 一、VB与C#简介 **Visual Basic** 是一种面向对象的编程语言,由微软公司开发。它被广泛应用于Windows平台上快速应用程序...

    java.net(c#)交换加密算法(java版本)

    根据提供的文件信息,本文将详细解释“java.net(c#)交换加密算法(java版本)”涉及的关键概念、实现原理及代码示例。 ### 1. 加密算法概述 #### 1.1 DES (Data Encryption Standard) 算法 DES是一种对称加密...

    C#和Java的区别.pdf

    - Java中,使用 `int i = Integer.parseInt("1234444");` 实现相同的功能。 7. 字符串的转换: - C#中,可以使用 `string num = 123.ToString();` 和 `string num = String.valueOf(123);` 来实现基本数据类型到...

    C++ Java C#.net VB.net 语法对比

    ### C++、Java、C# .NET 和 VB.NET 语法对比 #### 1. 基本数据类型 为了帮助开发者快速掌握不同编程语言的基本数据类型,以下表格提供了C++、VB.NET、C# .NET 和 Java 的基本数据类型的对应关系。 | 基础类型名 |...

    convert string to integer

    Java 提供了 `Integer.parseInt()` 或 `Integer.valueOf()` 方法。 ```java String str = "123"; int num = Integer.parseInt(str); System.out.println(num); // 输出:123 ``` 3. **JavaScript**: ...

    C# ,冒泡排序,JAVA

    根据给定的信息,本文将详细解释C#与Java语言中实现冒泡排序算法的方法,并对冒泡排序的基本原理、代码实现及其应用场景进行深入探讨。 ### 冒泡排序基本原理 冒泡排序是一种简单的排序算法,它重复地遍历待排序的...

    C#-DES_SAME_JAVA-DES.zip

    本代码是C#方法,通过开源C#BouncyCastle加密组件进行DES加解密。和JAVA DES加解密互通。JAVA方法如下: public static String desEncrypt(String source, String desKey) throws Exception { try { // 从原始...

    VB and C# Comparison(VB,C#语法比较)

    标题:VB和C#语法比较 描述:本文旨在对比Visual Basic .NET (简称VB...VB更倾向于自然语言风格,而C#则借鉴了许多C++和Java的特点,使得代码看起来更加紧凑和简洁。理解这些差异对于跨语言开发或迁移项目非常有帮助。

    geojson-geometry-shp格式相互转化总结

    case "java.lang.Integer": type = "integer"; break; // 其他类型的处理... } sql.append(name + " " + type); if (i () - 1) { sql.append(", "); } } sql.append(")"); // 执行SQL创建表 } } ``` ...

    C#_VB.NET转换工具

    2. **类型系统**:虽然两者类型系统基本一致,但表示方式不同,如C#中的`int`对应VB.NET的`Integer`,转换时需保持类型一致性。 3. **控制流语句**:循环、条件语句等在两种语言中的表达方式各异,工具需处理这些...

    Java 面试题集No.1 - 华为面试题

    - **Integer**:Integer是int的包装类,提供了一些额外的方法,如compareTo(),toString()等。Integer对象在内存中分配堆空间,可以为null。 4. **(int)与Integer.parseInt()的区别** - **(int)**:这是Java的...

Global site tag (gtag.js) - Google Analytics