学编程,来源栈;先学习,再交钱
当前系列: Java语法 修改

复习:J&C:Object / hash值 / equals() / toString() / 装箱拆箱

基本类型和包装对象带来的其实只有混乱。——大飞哥,^_^


包装对象

在Java中,基本类型变量不是(严格意义上的)对象。因为:

  • 没有 class int 的定义
  • int 也没有继承自Object
  • int 点不出Object的方法等

但是,Java提供了和基本类型相对应的类

  • int -> Integer
  • float -> Float
  • boolean -> Boolean
  • ……
  • char -> Character

演示:这些类由class定义,继承自Object,可以调用Object及其自有的类成员……

被称之为包装对象

-------------------------

#记忆小窍门#

和基本类型相比,包装对象:

  • 首字母大写
  • 使用全称

-------------------------

以下讲解,以int和Integer为例。


混用

很多时候,你会觉得int和Integer不分彼此:

Integer i = 20;    //直接赋值
i = new Integer(30);    //用构造函数赋值
i = Integer.valueOf(100);  //用静态方法赋值
int j = 50;
//可以互相赋值
i = j;
j = i;
//可以用 == 进行比较
System.out.println(i == j);
//使用++等运算符
j++;
i++;

@想一想@:这些赋值运算等过程中发生了什么?

  1. 当把一个整数值赋值给一个Integer变量的时候,Integer变量是引用类型,所以不能直接存放整数值的
  2. 所以,JVM会自动生成一个Integer对象,并将该整数值放入其中:自动装箱(auto-box)
  3. 当需要Integer进行运算(比如=/==/++)的时候,JVM会自动拆箱(auto-unbox)

差异

但Integer才是引用类型对象,所以只有Integer才可以:

  • 被赋值为null
  • 点(.)出类成员

null值的问题

当一个Integer为null值的时候:

Integer i = null;
以下运算都会报NullPointerException异常:
  • 赋值
    int j = i;
  • 比较
    int j = 0;
    System.out.println(i == j);
    但是两个Integer比较的时候不会报异常,
    Integer j = 20;
    System.out.println(i == j);
    @想一想@:为什么?
  • ++/--等
    i++;

两个Integer之间

@猜一猜@:true还是false?

Integer i = 20;
Integer j = Integer.valueOf(20);
     
System.out.println(i == j);  
然后,我们把i和j的值都变成986,再试一试。

发生了什么?!

  1. 由于i和j都是Integer引用类型,所以他们无论如何都不用管相等的
    Integer j = Integer.valueOf(i);    //这样都不行!
    PS:当Integer和int进行比较的时候,会比较他们的值。
  2. 为什么当i和j为20的时候,结果能为true呢?因为Java对-127-127之间的数据进行了缓存(Integer Cache)
    演示:F3转到valueOf()的定义

@@:为什么要这样做?有必要么?

建议:

  • 总是尽量使用int,因为没有装箱拆箱的过程,性能有些许提高。
  • 只在必须使用Integer的时候(即调用其类成员)使用Integer
源栈 源栈培训 Java Integer
觉得很 ,不要忘记分享哟!

任何问题,都可以直接加 QQ群:273534701

在当前系列 Java语法 中继续学习:

我们的 特色

  • 先学习,后付费
  • 线上/线下,自由组合

更多了解

QQ群:273534701

答疑解惑,远程debug……

B站 源栈-小九 的直播间

写代码要保持微笑 (๑•̀ㅂ•́)و✧