面试官:Java装箱与拆箱的区别?

回复“000”获取大量电子书

认识装箱和拆箱

装箱就是自动将基本数据类型转换为包装器类型(int-->Integer);调用方法:Integer的valueOf(int) 方法。

拆箱就是自动将包装器类型转换为基本数据类型(Integer-->int);调用方法:Integer的intValue方法。

在Java SE5之前,如果要生成一个数值为10的Integer对象,必须这样进行:

Integer i = new Integer(10);

而在从Java SE5开始就提供了自动装箱的特性,如果要生成一个数值为10的Integer对象,只需要这样就可以了:

Integer i = 10;

题1:以下代码会输出什么?

public class Main {
 public static void main(String[] args) {

Integer i1 = 100;
  Integer i2 = 100;
  Integer i3 = 200;
  Integer i4 = 200;

System.out.println(i1==i2);
  System.out.println(i3==i4);
 }
}

运行结果:

true
false

输出结果表明i1和i2指向的是同一个对象,而i3和i4指向的是不同的对象。

为什么会出现这样的结果?

此时只需一看源码便知究竟,下面这段代码是Integer的valueOf方法的具体实现:

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

其中IntegerCache类的实现为:

private static class IntegerCache {
  static final int high;
  static final Integer cache[];

static {
   final int low = -128;

// high value may be configured by property
   int h = 127;
   if (integerCacheHighPropValue != null) {
 // Use Long.decode here to avoid invoking methods that
 // require Integer's autoboxing cache to be initialized
 int i = Long.decode(integerCacheHighPropValue).intValue();
 i = Math.max(i, 127);
 // Maximum array size is Integer.MAX_VALUE
 h = Math.min(i, Integer.MAX_VALUE - -low);
   }
   high = h;

cache = new Integer[(high - low) + 1];
   int j = low;
   for(int k = 0; k < cache.length; k++)
 cache[k] = new Integer(j++);
  }

private IntegerCache() {}
 }

从这2段代码可以看出,在通过valueOf方法创建Integer对象的时候,如果数值在[-128,127]之间,便返回指向IntegerCache.cache中已经存在的对象的引用;否则创建一个新的Integer对象。

上面代码中i1和i2的数值为100,因此会直接从cache中取已经存在的对象,所以i1和i2指向的是同一个对象,而i3和i4则分别指向不同的对象。

题2:以下代码输出什么?

public class Main {
 public static void main(String[] args) {

Double i1 = 100.0;
  Double i2 = 100.0;
  Double i3 = 200.0;
  Double i4 = 200.0;

System.out.println(i1==i2);
  System.out.println(i3==i4);
 }
}

运行结果:

false
false

原因:在某个范围内的整型数值的个数是有限的,而浮点数却不是。

(0)

相关推荐

  • 常用类

    常用类 包装类 在类中查看属性方法的快捷键:Ctrl+F12 java.lang包会默认导入每个Java文件,所以我们不需要导入这个包,直接用包中的类就好了 byte Byte short Short ...

  • 包装类简述

    一.前言(可忽略) 作者是一位自学JAVA的小白,通过网上视频学习和自己对包装类的理解,现将自己对包装类的认知描述如下:(希望能与各位同行好友共同分享自己所学的java知识,同时,也热切期望各位同行前 ...

  • 详解Java的自动装箱与拆箱(Autoboxing and unboxing)

    详解Java的自动装箱与拆箱(Autoboxing and unboxing) 一.什么是自动装箱拆箱  很简单,下面两句代码就可以看到装箱和拆箱过程 1 //自动装箱2 Integer total ...

  • 2021Java春招面试:java栈和本地方法栈区别

    2021Java春招面试:java栈和本地方法栈区别

  • 面试官:抽象类和接口有什么区别?

    回复"000"获取大量电子书 抽象类和接口有什么区别? 这是一道初中级面试中频率相当高的,下面我们就来看看如何应答. 初级回答 实现:抽象类的子类使用 extends 来继承:接口 ...

  • 面试官:手写一个冒泡排序,并对其改进(java实现)

    转载自:https://blog.csdn.net/sdddlll/article/details/100574229 之前写过一篇选择排序,很多人把它和冒泡排序搞混了,这篇文章对冒泡排序进行一个分析 ...

  • 面试官问:为什么 Java 线程没有Running状态?我懵了

    Java虚拟机层面所暴露给我们的状态,与操作系统底层的线程状态是两个不同层面的事.具体而言,这里说的 Java 线程状态均来自于 Thread 类下的 State 这一内部枚举类中所定义的状态: 什么 ...

  • 让面试官眼前一亮的项目,JAVA面试必备

    作为一个程序员来说,简历可谓是面试的时候一个加分砝码,往往有的面试者只在意自己的技术,其实这是非常不对的. 简历对于一个面试者来说非常重要,他是第一个入口,也是面试官认识你的第一个途径.不管是对于刚毕 ...

  • 面试官问“你为何离职”,用这三招防守反击,才能见招拆招(干货文)!

    当代职场,铁打的营盘流水的兵,频繁跳槽已成为人才流动的常态.尽管多数单位不太喜欢"跳蚤一族",但面试官并不排斥多次跳槽者,面试官的发问和追问,重点在于如何鉴别候选人是不是" ...

  • 面试官:说说你对Java异常的理解

    回复"000"获取大量电子书 背景 不管是工作中还是面试中,异常这一块还是非常重要的.作为Java开发人员来说,学会如何处理异常,哪些异常必须自己处理,哪些异常可以往外抛等等,这些 ...

  • 女面试官提问:一箱酒12瓶,喝了1瓶还有多少呢?90后巧妙回答被录用

    如今的竞争如此的激烈,想要找一份好的工作真是难于上青天.加上现在的高材生越来越多,造成了职场求职的竞争更加的激烈,工作难找也就毋庸置疑了. 在众多的求职者中,面试官想要挖掘出自己最想要的人才,也是费尽 ...