zoukankan      html  css  js  c++  java
  • Integer封装类的相关知识

    java中,在一些情况下会有自动装箱与自动拆箱。

    自动拆箱/装箱是在编译期,依据代码的语法,决定是否进行拆箱和装箱动作。
    装箱过程:把基本类型用它们对应的包装类型进行包装,使基本类型具有对象特征。
    拆箱过程:与装箱过程相反,把包装类型转换成基本类型。

    正是因为装箱与拆箱,会发现一个很有趣的现象。

    先看下面代码1:

    public static void main(String[] args) {
            Integer a= 1;
            Integer b= 1;
            System.out.println("a==b  ?"+ (a==b));
    }

    运行上面代码,结果是: a==b  ?true

    我们在运行下面代码2:

    1 public static void main(String[] args) {
    2         Integer a= 255;
    3         Integer b= 255;
    4         System.out.println("a==b  ?"+ (a==b));
    5 }

    运行上面代码,结果是: a==b  ?false

    是不是很奇怪?

    这是因为:在java中,Integer对int类型自动装箱的时候,会有一个缓存机制。这个缓存机制认为对于int 值在 一个字节范围内的数:-128-127,是使用频率高的数,为了节省内存,对于这个范围的int自动装箱的时候,同一个int值,只会生成一个对象。

    我们对于代码2,利用反编译工具,查看编译后的class文件,如下

    1  public static void main(String[] args)
    2   {
    3     Integer a = Integer.valueOf(255);
    4     Integer b = Integer.valueOf(255);
    5     System.out.println("a==b  ?" + (a == b));
    6   }

    可以看到,jdk是利用Integer.valueOf()这个方法来对int基本类型自动装箱的。

    如果我们用new Integer()来对一个int类型封装(非自动装箱),就没有缓存机制(忽略int的值是否在-128-127)。

    如下代码:

    1 public static void main(String[] args) {
    2         Integer a = new Integer(1);
    3         Integer b = new Integer(1);
    4         System.out.println("a==b  ?"+ (a==b));
    5 }

    运行结果: a==b  ?false

  • 相关阅读:
    My Vim
    POJ 3292 Semi-prime H-numbers
    洛谷P3954 成绩【民间数据】
    数据结构—栈/队列
    说服式设计(persuasive design)的行为模型
    发送邮件给某人:mailto标签
    如何识别和利用用户情绪
    HDU Good Numbers (热身赛2)
    atlas z 轴
    什么叫“默认邮件客户端没有正确安装”?
  • 原文地址:https://www.cnblogs.com/westward/p/5145593.html
Copyright © 2011-2022 走看看