1. Int 和Integer 的区别,Java为什么要设计成封装类型?

  1. Int 和Integer 的区别,Java为什么要设计成封装类型?

(考察点:面向对象的理解,封装类型的特性和功能;

Integer是基本数据类型int的封装类,在java中8大基本数据类型 它的封装类是一一对应的。他们的区别有很多,比如,

第一个,int类型,我们可以直接定义一个变量名赋值即可,但是Integer需要使用new关键字创建对象;

第二个,基本类型和Integer 类型混合使用的时候,Java会自动通过拆箱和装箱实现类型的转换;

第三个,Integer 作为一个对象类型,封装了一些方法和属性,我们可以使用这些方法来操作数据。

第四个,作为成员变量,Integer的初始值是null,int的初始值是0;

第五个,Integer 它是存储在堆内存里面,因为它是一个对象,int 类型是直接存储在栈空间(先进后出);

为什么要设计成封装类型?

我认为主要的原因是,Java本身它是一个面向对象的语言,一切的操作都是以对象作为基础的,比如说 集合里面存的元素,也只支持存储Object类型,普通类型是无法通过集合来存储的。安全性好,隐藏了实现细节,对使用者更加友好。

装箱操作,内存地址,享元模式,互用对象

2. 说说Java自动装箱与拆箱?

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

3. 追问: Integer a1= 127 与 Integer a2 = 127相等吗

 Integer a1= 100与 Integer a2= 100 相等吗?

考察目标:== 内存地址匹配, 装箱拆箱 ,Integer 内部的设计原理,(享元模式 通过复用对象 减少对象的创建数量,减少内存占用和提升性能)

高手回答:

a1==a2 的结果都是是True, 原因Integer  内部用到了一个享元模式,也就是针对于-128 到127之间的数字做了一个缓存,使用Integer a1= 100这个方式 赋值的时候, java 默认会通过value 对100 这个数字进行装箱操作,从而触发了缓存机制,使得 a1和a2 指向了同一个Integer 的内存地址。

因为值都是100 ,并且默认通过装箱机制调用了valueOf方法从IntegerCache中拿到了两个完全相同的Integer实例。因此用等号比较得到的结果必然是true。

面试题 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指向的是不同的对
象。

4. 那如果是Double 类型的呢, Double a1= 127 与 Double a2 = 127相等吗?Double a1= 200.0与 Double a2 = 200.0相等吗

输出结果为false ,false
注意: 在某个范围内的整型数值的个数是有限的,而浮点数却不是。
  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值