Java包装类

    在Java中,为了更好的实现面向对象的特点,对八种数据类型(byte,boolean,short,char,int,long,float,double)都使用了类进行封装,这种类称之为包装类(Wrapper Class)。

在Java中,为了方便使用与开发,提供了包装类的两种使用类型
对象型(Object类的直接子类)数值型(Number类的直接子类)
Boolean,Character(char)Byte,Short,Float,Integer(int),Double,Long
关于Number类
    Number的定义以及Number类里定义的6种方法  
Number类定义public abstract class Number implements java.io.Serializable 
int类型转换public abstract int intValue();
long类型转换public abstract long longValue();
float类型转换public abstract float floatValue();
double类型转换public abstract double doubleValue();
byte类型转换public byte byteValue();
short类型转换public short shortValue()

装箱与拆箱

    在JDK1.5以前,一直使用的是手工的装箱与拆箱,我以int和Integer举例

 Integer num = new Integer(100);
 int data = num.intValue();
 System.out.println(data);

    在JDK1.5以后,Java提供了自动拆装箱的机制,因为这种机制的产生,在使用与开发中可以直接使用包装类的对象进行各种数学计算。我举一个自动拆装箱的例子:

Integer number = 100;
System.out.println(number*4);

那么,在进行对象的比较时,必不可少的存在使用"=="和"equals"的使用问题。JDK1.5之后,使用自动装箱拆箱的时候,有一个大坑(我用代码来演示一下)

Integer y =120;
Integer y1 = 120;
Integer x = 130;
Integer x1 = 130;
System.out.println(y == y1);
System.out.println(x == x1);

那么,一般来说这里的输出,应该是两个true对吧,但是,我们现在来看一下实际的输出


诺,这里在比较x和x1的时候输出了false,我来解释一下这一点:    

    对于 Integer var = ? 在 -128到127之间赋值的话,Integer对象是在IntegerCache.cache产生,这个时候我们可以理解成对象被入池了,所以会复用已有对象,所以,在这个区间内,我们可以用"=="来进行判断。但是,如果在这个区间以外的所有数据,存储的位置都会在堆上,并不会复用已有对象。所以在这里会输出false。

    所以,在阿里巴巴Java开发手册里有过规定:对于所有相同类型的包装类对象之间值的比较,规定使用equals进行判断。

接下来,既然有了Integer,那么int什么时候用呢?在阿里的编码规范中也有过相关的规定

    1:所有的POJO(Plain Ordinary Java Objects)类属性必须使用包装数据类型;

    2:RPC方法的返回值和参数必须使用包装数据类型;

    3:局部变量推荐使用基本数据类型;

字符串与基本数据类型的转换

    举个例子(将字符串转换为int型), 如果要转换的字符串中含有非数字,那么就会报错。

 String str = "123";
 int num = Integer.parseInt(str);
 System.out.println(num);
我对于包装类的总结就到这里,后续还会有补充
### Java 包装详解 Java 中的包装(Wrapper Class)是用来将基本数据型(Primitive Data Type)转换为对象(Object)的一种机制。包装的作用是提供一种方式,使得基本数据型可以像对象一样被操作,例如存储在集合中或进行其他面向对象的操作。 #### 1. 基本数据型与包装的关系 Java 提供了八种基本数据型及其对应的包装[^2]: - **byte** ↔ **Byte** - **short** ↔ **Short** - **int** ↔ **Integer** - **long** ↔ **Long** - **float** ↔ **Float** - **double** ↔ **Double** - **char** ↔ **Character** - **boolean** ↔ **Boolean** 这些包装都位于 `java.lang` 包中,因此不需要显式导入即可使用。 #### 2. 包装的功能 包装的主要功能包括以下几点: - 将基本数据型转换为对象。 - 提供方法来操作和转换基本数据型。 - 提供静态方法将字符串转换为基本数据型。 #### 3. 基本数据型与包装之间的转换 ##### (1) 基本数据型 → 包装 可以通过构造方法或自动装箱(Autoboxing)实现基本数据型到包装的转换。例如: ```java // 使用构造方法 Integer integer = new Integer(100); // 已过时,不推荐使用 // 自动装箱 Integer integerAutoBoxed = 100; // 推荐使用 ``` ##### (2) 包装 → 基本数据型 可以通过调用包装的 `xxxValue()` 方法或自动拆箱(Unboxing)实现包装到基本数据型的转换。例如: ```java Integer integer = new Integer(100); int primitiveInt = integer.intValue(); // 调用intValue()方法 int autoUnboxedInt = integer; // 自动拆箱 ``` #### 4. 包装与字符串的相互转换 ##### (1) 包装 → 字符串 可以通过 `String.valueOf()` 方法将包装转换为字符串。例如: ```java Integer integer = 100; String str = String.valueOf(integer); // 使用String的静态方法 ``` ##### (2) 字符串 → 包装 可以通过包装的 `parseXxx(String s)` 静态方法将字符串转换为包装。例如: ```java String str = "100"; int primitiveInt = Integer.parseInt(str); // 转换为基本数据型 Integer wrapperInt = Integer.valueOf(str); // 转换为包装 ``` #### 5. 包装的常用方法 以下是一些常用的包装方法: - **`compareTo()`**:用于比较两个对象的大小。 - **`equals()`**:用于判断两个对象是否相等。 - **`toString()`**:返回对象的字符串表示形式。 - **`hashCode()`**:返回对象的哈希码值。 #### 6. 注意事项 - **自动装箱与拆箱**:从 Java 5 开始支持自动装箱和拆箱,简化了代码编写,但需要注意潜在的性能问题。 - **缓存机制**:某些包装(如 `Integer`、`Boolean` 等)实现了缓存机制,避免频繁创建新对象。例如,`Integer` 在 -128 到 127 之间的值会被缓存[^1]。 - **空指针异常**:在使用自动拆箱时,如果包装对象为 `null`,会导致 `NullPointerException`。 ```java Integer a = null; int b = a; // 抛出NullPointerException ``` #### 7. 示例代码 以下是一个综合示例,展示如何使用包装进行型转换: ```java public class WrapperClassExample { public static void main(String[] args) { // 基本数据型转包装 Integer integer = Integer.valueOf(100); // 显式转换 Integer autoBoxed = 100; // 自动装箱 // 包装转基本数据型 int primitiveInt = integer.intValue(); // 显式转换 int autoUnboxed = integer; // 自动拆箱 // 包装转字符串 String str = String.valueOf(integer); // 字符串转包装 String strValue = "200"; Integer parsedInteger = Integer.valueOf(strValue); System.out.println("integer: " + integer); System.out.println("primitiveInt: " + primitiveInt); System.out.println("str: " + str); System.out.println("parsedInteger: " + parsedInteger); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值