包装类简介
基本数据类型(如int, float, double, char, boolean等)是直接在栈内存中分配的,它们不是对象,因此不能直接调用对象所拥有的方法。为了克服这个限制,Java为每个基本数据类型提供了对应的包装类,包装类的出现是为了解决8个基本类型不能直接参与面向对象开发的问题。本质上讲
就是可以通过包装类让基本类型以"对象"的形式出现。 java为8个基本类型提供了8个包装类。
int->Integer
char->Character
其他包装类的类名与基本类型一致,只是首字母大写。如:
double->Double
包装类作用
- 提供方法支持:包装类为它们所封装的基本数据类型提供了丰富的方法。例如,Integer类提供了parseInt(String s, int radix)来将字符串转换为整数,toString()方法将整数转换为字符串等。
- 支持泛型:在Java中,泛型(Generics)是一种在编译时期进行类型检查的机制,它不允许基本数据类型作为类型参数。这意味着,如果你需要在集合(如List, Set等)中存储基本数据类型的数据,你必须使用它们的包装类。例如,List<Integer>是合法的,但List<int>不是。
- 基本数据类型与对象之间的转换:包装类提供了在基本数据类型和对象之间转换的便捷方式。例如,通过Integer.valueOf(int i)可以将int转换为Integer对象,通过Integer.intValue()可以将Integer对象转换回int。
- 实现接口:包装类实现了某些接口,这使得它们能够用在需要这些接口实现的场景中。例如,Integer类实现了Comparable接口,这使得Integer对象能够直接用于排序等操作。
- 提升代码的灵活性和可维护性:通过使用包装类,可以在需要时轻松地添加新的方法或行为,而无需修改基本数据类型的定义。这有助于保持代码的灵活性和可维护性。
代码实例
int i = 13;
Integer i1 = new Integer(i);
/*
爆红原因:
从Java 9开始,虽然Integer(int)构造函数没有被正式标记为@Deprecated(即没有显式地标记为过时),
但Java官方推荐使用自动装箱(autoboxing)而不是直接调用构造函数来创建Integer对象。
自动装箱是Java 5(也称为Java 1.5)引入的一个特性,它允许自动将基本数据类型(如int)转换为对应的包装类型(如Integer),而无需显式调用构造函数。
因此,在Java 5及更高版本中,您可以直接将基本数据类型赋值给包装类型的变量,Java编译器会自动完成转换。
使用自动装箱
Integer i1 = i; // Java会自动将int转换为Integer
*/
Integer i2 = i;
System.out.println(i1 == i);//true
System.out.println(i2 == i1);//false
//在包装类中都重写了equals方法
System.out.println(i2.equals(i1));//true
/*
包装类提供了静态方法valueOf,可以将对应的基本类型转换为包装类
推荐这种方式,而不是直接new。
Integer的valueOf会像字符串String一样,去缓存对象。但是它只
缓存-128到127之内的数字。其余的全部为new。
*/
i = 128;
Integer i3 = Integer.valueOf(i);
Integer i4 = Integer.valueOf(i);
System.out.println(i3 == i4);//false
double d = 123.123;
Double d1 = Double.valueOf(d);
Double d2 = Double.valueOf(d);
System.out.println(d1 == d2);//是否为同一对象 false
System.out.println(d1.equals(d2));//内容是否相同 true
int in = i4.intValue();
System.out.println(in);
//可以从其他类型传出
long lon = i4.longValue();
System.out.println(lon);
//溢出现象任然会丢失精度
byte byt = i4.byteValue();
System.out.println(byt);
/*
数字类型的包装类:
Byte,Short,Integer,Long,Float,Double
上述6个包装类统一继承自Number的类
Number中定义了一组方法:
int intValue()
byte byteValue()
short shortValue()
...
*/
//小数包装类如果转换为整数,会丢失精度
in = d1.intValue();//d1:123.123-->int:123
System.out.println(in);//123
double dou = d1.doubleValue();
System.out.println(dou);//123.123
包装类中定义了常量表达其基本类型的取值范围
包装类提供一个静态方法:parseXXX(String str)
将字符串解析为对应的基本类型
String——>基本类型
int i_max = Integer.MAX_VALUE;
System.out.println(i_max);//2147483647
int i_min = Integer.MIN_VALUE;
System.out.println(i_min);//-2147483648
double d_max = Double.MAX_VALUE;
System.out.println(d_max);//1.7976931348623157E308
String str = "123";
int i = Integer.parseInt(str);
System.out.println(i);
double d = Double.parseDouble(str);
System.out.println(d);
String str2 = "123.123";
/*
包装类将字符串转换为基本类型时,要求该字符串要正确描述基本类型
可以保存的值,否则会抛出NumberFormatException
数字 格式 异常
*/
// i = Integer.parseInt(str2);
// System.out.println(i);
d = Double.parseDouble(str2);
System.out.println(d);
float f = Float.parseFloat(str2);
System.out.println(f);