Java岗面试题--Java基础(日积月累,每日三题)

面试题一:Integer 和 int 的区别?

  1. int 是 Java 的八种基本数据类型之⼀,而 Integer 是 Java 为 int 类型提供的封装类;
  2. int 型变量的默认值是 0,Integer 变量的默认值是 null,这⼀点说明 Integer 可以区分出未赋值和值为 0 的区分;
  3. Integer 变量必须实例化后才可以使用,而 int 不需要。

Integer 和 int 的比较延伸:

  1. 由于 Integer 变量实际上是对⼀个 Integer 对象的引用,所以两个通过 new ⽣成的 Integer 变量永远是不相等的,因为其内存地址是不同的;
  2. Integer 变量和 int 变量比较时,只要两个变量的值是相等的,则结果为 true。因为包装类 Integer 和基本数据类型 int 类型进行比较时,Java 会⾃动拆包装类为 int,然后进行比较,实际上就是两个 int 型变量在进行比较;
  3. 非 new 生成的 Integer 变量和 new Integer() 生成的变量进行比较时,结果为 false。因为非 new 生成的 Integer 变量指向的是 Java 常量池中的对象,而 new Integer() 生成的变量指向堆中新建的对象,两者在内存中的地址不同;
  4. 对于两个非 new 生成的 Integer 对象进行比较时,如果两个变量的值在区间 [-128, 127] 之间,则比较结果为 true,否则为 false。Java 在编译 Integer i = 100 时,会编译成 Integer i = integer.valueOf(100),而 Integer 类型 的 valueOf 的源码如下所示:
public static Integer valueOf(int var0) { 
    return var0 >= -128 && var0 <= Integer.IntegerCache.high ?
        Integer.IntegerCache.cache[var0 + 128] : new Integer(var0);
}

从上面的代码中可以看出:Java 对于 [-128, 127] 之间的数会进行缓存,比如:Integer i = 127,会将 127 进行缓存,下次再写 Integer j = 127 的时候,就会直接从缓存中取出,而对于这个区间之外的数就需要 new 了。

关于包装类的缓存:

Boolean:全部缓存
Byte:全部缓存
Character:<= 127 缓存
Short:-128 — 127 缓存
Long:-128 — 127 缓存
Integer:-128 — 127 缓存
Float:没有缓存
Double:没有缓存

追问一:装箱和拆箱 (说一说自动装箱、自动拆箱的应用场景)

自动装箱是 Java 编译器在基本数据类型和对应得包装类之间做的⼀个转化。比如:把 int 转化成Integer,double 转化成 Double 等等。反之就是自动拆箱。

原始类型:boolean、char、byte、short、int、long、float、double

封装类型:Boolean、Character、Byte、Short、Integer、Long、Float、Double

追问二:为啥要有包装类?

Java 语言是面向对象的语言,其设计理念是「一切皆对象」。但 8 种基本数据类型却出现了例外,它们不具备对象的特性。正是为了解决这个问题,Java 为每个基本数据类型都定义了一个对应的引用类型,这就是包装类。

通过自动装箱、自动拆箱功能,可以大大简化基本类型变量和包装类对象之间的转换过程。比如,某个方法的参数类型为包装类型,调用时我们所持有的数据却是基本类型的值,则可以不做任何特殊的处理,直接将这个基本类型的值传入给方法即可。

扩展阅读
Java 之所以提供 8 种基本数据类型,主要是为了照顾程序员的传统习惯。这 8 种基本数据类型的确带来了一定的方便性,但在某些时候也会受到一些制约。比如,所有的引用类型的变量都继承于 Object 类,都可以当做 Object 类型的变量使用,但基本数据类型却不可以。如果某个方法需要 Object 类型的参数,但实际传入的值却是数字的话,就需要做特殊的处理了。有了包装类,这种问题就可以得以简化。

面试题二:如何对 Integer 和 Double 类型判断相等?

Integer、Double 不能直接进行比较,这包括:

  1. 不能用「==」进行直接比较,因为它们是不同的数据类型;
  2. 不能转为字符串进行比较,因为转为字符串后,浮点值带小数点,整数值不带,这样它们永远都不相等;
  3. 不能使用「compareTo」方法进行比较,虽然它们都有「compareTo」方法,但该方法只能对相同类型进行比较。

可以将 Integer、Double 先转为转换为相同的基本数据类型(如 double ),然后使用「==」进行比较。

Integer i = 100;
Double d = 100.00;
System.out.println(i.doubleValue() == d.doubleValue());

面试题三:Object 的常用方法有哪些?

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SuZhan7710

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值