zoukankan      html  css  js  c++  java
  • 拆装箱易错面试题

    一.包装类与基本数据类型比较

    1 public class IntegerDemo {
    2     public static void main(String[] args) {
    3   
    4         int i = 10;
    5         Integer ii = 10;
    6         System.out.println(i == ii);
    7     }
    8 }
    9 输出结果:true

    包装类在与基本类型在进行数值比较时:包装类会自动拆箱成对应的基本类型数据

    如上代码在进行比较时,Integer类型的ii会拆箱成int类型的ii与i进行比较

    二.ValueOf

     1 public class IntegerDemo {
     2     public static void main(String[] args) {
     3         
     4         Integer i1 = 100;
     5         Integer i2 = 100;
     6         Integer i3 = 200;
     7         Integer i4 = 200;
     8         System.out.println(i1 == i2);
     9         System.out.println(i3 == i4);
    10     }
    11 }
    12 输出结果:
    13 true
    14 false

    这些赋值实际上分为两步(以Integer i1 = 100为例):

      1.定义基本数据类型数据并赋值:int i = 100;

      2.将基本数据类型转换为包装类:Integer i1 = Integer.valueOf(i);

    这是ValueOf方法中一个很小的知识点,即使工作了的同事也很容易翻车,需要我们从源代码中找答案

    1 ValueOf()代码:
    2  public static Integer valueOf(int i) {
    3         if (i >= IntegerCache.low && i <= IntegerCache.high)
    4             return IntegerCache.cache[i + (-IntegerCache.low)];
    5         return new Integer(i);
    6     }

    我们发现在valueOf中传入的值会进行判断,那么这个判断的范围是什么呢?

    static final int low = -128;
    static final int high;
    

    我们发现最小值是-128,而最大值没有进行判断,那么最大值是多少呢?

     1 static {
     2     // high value may be configured by property
     3     int h = 127;
     4     String integerCacheHighPropValue =
     5         sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
     6     if (integerCacheHighPropValue != null) {
     7         try {
     8             int i = parseInt(integerCacheHighPropValue);
     9             i = Math.max(i, 127);
    10             // Maximum array size is Integer.MAX_VALUE
    11             h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
    12         } catch( NumberFormatException nfe) {
    13             // If the property cannot be parsed into an int, ignore it.
    14         }
    15     }
    16     high = h;
    17     cache = new Integer[(high - low) + 1];
    18     int j = low;
    19     for(int k = 0; k < cache.length; k++)
    20         cache[k] = new Integer(j++);
    21     
    22     // range [-128, 127] must be interned (JLS7 5.1.7)
    23     assert IntegerCache.high >= 127;
    24 }

    我们在静态代码块中发现了high的值,high的值一般等于h的值为127

    那么我们得到结论:

      1.当传入的值在-128~127之间时,会从cache数组中返回Integer对象

      2.当传入的值不在-128~127之间时,就会new Integer(i)

    得出答案:

      i1与i2传入的值为100,在-128~127之间,返回 Integer 对象的地址引用是一样的,结果为true

      i3与i4传入的值为200,不在-128~127之间,需要new对象,地址肯定不相同,此时结果也就为false了

  • 相关阅读:
    解决asp.net丢失session的方法文件
    Asp.net 从客户端中检测到有潜在危险的Request.Form值
    解决 ORA-12154 TNS无法解析指定的连接标识符
    sys用户权限不足,本地登录失败 |ORA-01031 insufficient privileges|
    Android按钮单击事件处理的几种方法(Android学习笔记)
    百度地图自定义放大缩小按钮
    百度地图 JS API开发Demo01
    java微信授权登录传参给redirect_uri 接口,回到原页面,传递多个参数
    利用padding-top/padding-bottom百分比,进行占位和高度自适应
    Rotate Array 旋转数组 JS 版本解法
  • 原文地址:https://www.cnblogs.com/lyc-code/p/12521580.html
Copyright © 2011-2022 走看看