Java 基础: 包装类和原始数据类型

作者: admin 分类: Java深入理解 发布时间: 2020-03-27 01:07

所有原始数据类型都有一个与之对应的类,即包装类(wrapper)。包装类的特性

  • 包装类是不可变类,在构造了包装对象后,不允许更改包装在其中的值;
  • 包装类是 final 的,不能定义他们的子类。

下图为 Integer 类的定义:

下图为 Number 类的定义:

包装类的常用方法如下:

自动装箱和自动拆箱
自动装箱:Java 将原始数据类型值转换成对应的对象,比如将 int 的变量转换成Integer 对象。
自动拆箱:自动将Integer对象转换成int类型值

1
2
Integer i = 3; 
int j = i; // 自动拆箱。实际上执行了 int j = Integer.intValue();

包装类和原始数据类型的区别

  • 包装类的默认值为 null,原始数据类型的默认值为 0 或 false
  • 集合类中只能使用包装类
  • 泛型中使用包装类
  • 数据库查询的结果为 null 时,不能赋给原始数据类型,得使用包装类。(这也是为什么 PO 中建议只用包装类,而不是使用原始数据类型)
  • 使用 > 或 < 比较大小时会自动拆箱,使用 == 比较时不会
  • Java常量池中数值范围为[-128,127],使用字面值为一个包装类初始化,如果字面值在[-128,127]之间,jvm会在常量池中寻找该常量,那么该包装类的引用指向的是常量池中的一片区域,如果字面值超过这个范围,会创建包装类对象(即分配一个新的内存地址)
1
2
3
4
5
6
7
8
9
10
11
12
public class  {

    public static void main(String[] args) {
        Integer i1 = 127;//指向常量池中的127
        Integer i2 = 127;//指向常量池中的127
        System.err.println(i1 == i2);//指向同一内存区域,输出true

        i1 = 128;  //创建对象
        i2 = 128;  //创建对象
        System.err.println(i1 == i2);  //指向不同区域,输出false
    }
}

注意:包装类的 == 比较的是地址是否相等,原始数据类型的 == 比较的是值是否相等

使用场景举例
Integer 的默认值为 null,即 Integer 可以区分出未赋值和值为 0 的区别,int 则无法表达出未赋值的情况。例如,要想表达出没有参加考试和考试成绩为 0 的区别。

在 JSP 开发中,Integer 的默认值为 null,所以用 EL 表达式在文本框中显示时,值为空白字符串,而 int 的默认值为 0,所以用 EL 表达式在文本框中显示时为 0。

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

发表评论

邮箱地址不会被公开。 必填项已用*标注