Java中的包装类

Java包装类

Java有两种数据类型,基本数据类型引用数据类型,但是有时候我们会有这样的需求,用基本数据类型成员去做某些事,比如调用方法,但是基本数据类型并不是对象,无法满足我们的需求。

所有的基本类型都有一个与之对应的包装类,如下:

在这里插入图片描述
在这里就拿Integer /ˈɪntɪdʒər/类来举例子,先看看Integer类的构造方法
public Integer(int value)
public Integer(String s) throws NumberFormatException
从第一个构造方法可以知道,可以通过构造方法的形式将一个基本数据类型int转换为Integer类对象
第二个构造方法可以知道,可以传一个字符串构成Integer类对象,但是这个字符串必须是由数字构成的字符串
举例如下:

package com.qty4.demo;

/*
 * @author F3ver1
 * @date 2018/10/23 16:31
 */
public class Demo {
    public static void main(String[] args) {
        int a = 10;
        Integer integer = new Integer(a);
        Integer integer1 = new Integer(20);
        Integer integer2 = new Integer("30");
        System.out.println(integer);
        System.out.println(integer1);
        System.out.println(integer2);
    }
}

结果打印:
10
20
30

如果把其中的String s换成不是纯数字构成字符串:

public class Demo {
    public static void main(String[] args) {
        Integer integer3 = new Integer("a3");
        System.out.println(integer3);
    }
}

结果会抛出java.lang.NumberFormatException 的异常,此时字符串无法被解析为整数,因此第二个构造方法传入的参数必须是纯数字的字符串。

基本数据类型转换为包装类的方法:

public static Integer valueOf(int i)
public static Integer valueOf(String s) throws NumberFormatException

public class Demo {
    public static void main(String[] args) {
        Integer integer = Integer.valueOf(100);
        Integer integer1 = Integer.valueOf("100");
        System.out.println(integer);
        System.out.println(integer1);
    }
}

结果:
100
100

这里同样不能传入非纯数字的字符串,否则就会抛出NumberFormatException异常。

那么包装类型转基本数据类型同样有如下方法:

public class Demo {
    public static void main(String[] args) {
        Integer integer = Integer.valueOf(100);     //手动装箱
        int i = integer.intValue();                 //手动拆箱
         System.out.println(i);
    }
}

同时,Integer类也提供了int和String类之间的相互转换:

字符串转换为int:

public static int parseInt(String s)

public class Demo {
    public static void main(String[] args) {
        String str = "100";
        int x = Integer.parseInt(str);
        System.out.println(x);
    }
}

而int转换为字符串利用String类中的valueOf()方法即可。


在这里基本数据类型转换为对应包装类也叫做“装箱操作”,包装类转换为对应基本数据类型叫“拆箱操作”,上述操作较为繁琐,JDK1.5后提供了自动装箱和自动拆箱操作。

public class Demo {
    public static void main(String[] args) {
        Integer a = 100;       //实际上是Integer a = Integer.valueOf(100);
        int b = a + 20;        //实际上是先拆箱,int x = a.intValue();x与基本数据类型运算,得到120,再计算b=x;
        System.out.println(b);
       ------------------------------------------------------------
        Integer c = 100;       //实际上是Integer c = Integer.valueOf(100);
        Integer d = c + 20;    //实际上是先拆箱,int x = c.intValue();x与基本数据类型运算,得到120,再进行自动装箱
        					   //Integer d = y.valueOf(120);      
        System.out.println(d);    
    }                         
}

结果打印:
120
120

自动拆装箱的解释写在备注,其中x和y算作中间值,方便理解。

在这里写个常见问题

public class Demo {
    public static void main(String[] args) {
        Integer i1 = 127;
        Integer i2 = 127;
        System.out.println(i1==i2);
        System.out.println(i1.equals(i2));
       ------------------------------------------------------------
        Integer i3 = 200;
        Integer i4 = 200;
        System.out.println(i3==i4);
        System.out.println(i3.equals(i4));
    }
}

结果打印:
true
true
false
true

第一个为true,而第三个为false的原因在于,Java自动装箱规范要求介于-128~127之间为一个字节常量值,大于这个值将会保存在不同的对象中,因此前者为true,后者为false.

另外,如果Integer和Double同时使用于一个条件表达式,那么Integer会自动拆箱,提升为double,再自动装箱为Double,比如:

Integer i = 5;
Double j = 10.0;
System.out.println(i<j?i:j);

这里将打印:
5.0

<think>嗯,用户想了解Java包装的作用和使用场景。首先,我需要回忆一下包装的基本概念。包装,比如Integer、Double这些,对应基本型int、double,把基本型变成对象。那为什么要这么做呢?可能是在需要对象的时候,比如集合只能存储对象,不能存基本型。这时候就需要用包装了。 然后,用户的问题还包括使用场景,得具体说明哪些情况下必须用包装。比如集合框架,泛型,还有数据库操作的时候,字段可能为null,这时候用基本型就不行,只能用包装。另外,包装还提供了很多方法,比如转换方法,比如Integer.parseInt(),这些功能也是基本型没有的。 还要注意自动装箱和拆箱的机制,这会影响性能。比如频繁的装箱拆箱可能会有性能损耗,这时候可能需要权衡使用基本型还是包装。比如在循环里大量使用包装可能不太好,但如果是偶尔使用,可能影响不大。 引用里的资料提到,在POJO中属性用包装,RPC方法的参数和返回值用包装,而局部变量用基本型。这点需要解释清楚,为什么POJO要用包装?因为POJO可能对应数据库的字段,数据库里的字段可能为null,用基本型无法表示null,会导致问题。而RPC方法可能需要传递可能为null的值,所以用包装更合适。 另外,缓存机制,比如Integer的-128到127的缓存,这个可能影响比较操作,比如用==比较的时候可能会有意外结果,应该用equals方法。这点也需要提到,作为使用时的注意事项。 还要提到包装的方法,比如型转换、进制转换、最大值最小值常量,这些方法给开发者提供了便利,不用自己实现。 总结一下,包装的作用主要是让基本型可以以对象形式使用,适用于集合、泛型、数据库映射、允许null值的场景。而基本型在性能敏感、不需要对象的情况下使用,比如局部变量。 可能用户作为初学者,可能对自动装箱拆箱不太熟悉,需要简单说明一下。比如自动装箱就是自动把int转成Integer,拆箱反之。但要注意null拆箱会抛出NullPointerException,所以在使用包装时要避免这种情况。 最后,确保回答结构清晰,分点说明作用和场景,并引用相关的资料来支持观点。比如引用[1]提到包装允许基本型当对象处理,引用[4]提到POJO和RPC中使用包装。这些引用需要自然地融入回答中,作为论据。</think>### Java包装的作用及使用场景 #### 一、包装的作用 1. **对象化基本型** 包装(如$Integer$, $Double$, $Boolean$)将基本型(如$int$, $double$, $boolean$)封装为对象,使其可以用于需要对象操作的场景,例如集合、泛型等[^3][^4]。 2. **支持`null`值** 基本型不能赋值为`null`,而包装可以表示缺失值或无效状态,适用于数据库字段映射或可选参数场景。 3. **提供工具方法** 包装内置了型转换、进制转换、最大值/最小值常量等方法。例如: - $Integer.parseInt("123")$ - $Integer.toHexString(255)$[^1][^3]。 4. **实现自动装箱与拆箱** Java支持基本型与包装的自动转换(装箱:$int \rightarrow Integer$;拆箱:$Integer \rightarrow int$),简化代码编写[^4]。 #### 二、使用场景 1. **集合与泛型** 集合(如$List$, $Map$)和泛型仅支持对象型,必须使用包装。 例如: ```java List<Integer> list = new ArrayList<>(); // 必须用Integer而非int ``` 2. **数据库实体(POJO)** 数据库字段可能为`null`,POJO的属性需定义为包装以兼容空值。 例如: ```java public class User { private Integer age; // 允许age为null } ``` 3. **RPC方法参数与返回值** 远程方法调用(RPC)中,参数和返回值需支持`null`或未初始化状态,优先使用包装。 4. **需要对象操作的场景** 例如反射、序列化、多态等依赖对象特性的操作。 #### 三、注意事项 1. **性能权衡** 频繁装箱/拆箱可能影响性能,在循环或高性能场景中优先使用基本型。 2. **比较操作** 包装需用$equals()$比较值,而非`==`(`==`比较对象地址)。 例如: ```java Integer a = 200; Integer b = 200; System.out.println(a.equals(b)); // true System.out.println(a == b); // false(超出缓存范围) ``` 3. **缓存机制** $Integer$对-128到127的值有缓存优化,直接复用对象,此范围内`==`可能返回true。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值