zoukankan      html  css  js  c++  java
  • Integer自动装箱分析

    先看看下面的代码会输出什么:

    public static void main(String[] args) {

    Integer i = 127;

    Integer j = 128;

    Integer ii = 127;

    Integer jj = 128;

    System.out.println( i==ii );

    System.out.println( j==jj );

    }

    答案是:true,false

    这是为什么呢?原因在于装箱动作是通过valueOf方法实现的,

    在valueOf方法中采用了对象池。如果参数在-128~127之间,则

    直接从对象池中获得对象,不在该范围之内的才通过new生成包装对象。

    我们来看看源代码:

    public static Integer valueOf(int i) {

    assert IntegerCache.high >= 127;

    if (i >= IntegerCache.low && i <= IntegerCache.high)

    //low=-128,high=127

    return IntegerCache.cache[i + (-IntegerCache.low)];

    return new Integer(i);

    }

    那么装箱的动作为什么看不到呢?你怎么知道一定是调用valueOf函数呢?

    自动装箱是编译其行为。我们可以将代码编译后再进行反编译,看看JVM指令是什么。

    下面是上面例子中反编译出来的部分代码:

    Compiled from "IntegerTest.java"

    public class Test.IntegerTest {

    public Test.IntegerTest();

    Code:

    0: aload_0

    1: invokespecial #1 // Method java/lang/Object."<init>":()V

    4: return

    public static void main(java.lang.String[]);

    Code:

    0: bipush 127

    2: invokestatic #2 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;

    5: astore_1

    6: sipush 128

    9: invokestatic #2 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;

    }

    我们可以看到自动装箱确实是调用valueOf函数

  • 相关阅读:
    作业
    第一次作业
    临时和永久关闭firewalld与selinux
    联合删除
    使用CascadingDropDown实现级联式下拉框
    使用createElement动态创建HTML对象.
    关于DotNetZip的用法
    网站性能优化:cache-control设置详解
    百度蜘蛛Baiduspider User-Agent字段更新与IP判断
    (转)一个简单,方便的七牛云存储的客户端(收藏)
  • 原文地址:https://www.cnblogs.com/downey/p/4946823.html
Copyright © 2011-2022 走看看