JAVA包装类

本文深入解析Java中的包装类,包括其定义、使用场景、装箱与拆箱过程,以及字符串与基本数据类型之间的转换方法。文章还探讨了包装类在特定数值范围内的对象复用机制,提醒开发者注意在进行对象比较时可能遇到的陷阱。

包装类


Object类可以接收所有的引用数据类型,但是我们都知道,在Java中,数据类型分为基本数据类型和引用数据类型,那么基本数据类型应该如何处理?这就引入了包装类,也就是指,将基本数据类型封装到类中。看一个简单的包装类,int数据类型的包装类,利用intvalue就可以实现基本数据类型变为对象的需求。看代码:

//int数据类型的包装类
class Int{
	 private int num;
	 public Int(int num){
		  this.num = num;
	 }
	 public int intvalue(){
		 return this.num;
 	}
}
public class Package{
	 public static void main(String[] args){
 		 //子类向上转型
 		 Object obj = new Int(10);
 		 //向下转型,强转
 		 Int tmp = (Int)obj;
 		 //取出里面的基本数据类型操作
 		 System.out.println(tmp.intvalue());
	 }
}
D:\MySQL5.7\javawork>java Package
10

结论
将基本数据类型包装为一个类对象的本质就是使用Object进行接收处理。所以为了方便开发,专门提供了包装类的使用,而对于包装类的使用,提供了两种类型:
(1)对象型(Object的直接子类)Boolean, Character(char);
(2)数值型(Number的直接子类)Byte, Double, Short, Long, Integer(int), Float;
Number类:public, abstract, class, Number, implements, java.io.Serializable.
装箱与拆箱
(1)装箱:将基本数据类型变为包装类,利用每一个包装类提供的构造方法实现装箱处理;
(2)拆箱:将包装类中包装的基本数据类型取出,利用Number类中的六种方法。
(3)手工装箱拆箱

//装箱
Integer num = new Integer(10);
//拆箱
int data = num.intvalue();
System.out.println(data);

(4)自动装箱拆箱

//自动装箱
Integer x = 10;
//直接利用包装类对象操作
System.out.println(++x*5);

(5)注意问题,看代码:

public class Package{
 	public static void main(String[] args){
 		 //-128
 		 Integer a = Integer.valueOf(-128);
	         Integer b = Integer.valueOf(-128);
		 //127
 		 Integer c = Integer.valueOf(127);
 		 Integer d = Integer.valueOf(127);
 		 //-129
 		 Integer e = Integer.valueOf(-129);
 		 Integer f = Integer.valueOf(-129);
 		 //128
	 	 Integer j = Integer.valueOf(128);
	 	 Integer k = Integer.valueOf(128);
	 	 System.out.println(a == b);//true
	         System.out.println(a.equals(b));//true
	  	 System.out.println(c == d);//true
	         System.out.println(c.equals(d));//true
	 	 System.out.println(e == f);//false
	         System.out.println(e.equals(f));//true
	         System.out.println(j == k);//false
	         System.out.println(j.equals(k));//true
	    }
	}
D:\MySQL5.7\javawork>java Package
true
true
true
true
false
true
false
true

可以看到,结果与预期还是有些差距的。为什么会导致这样的结果呢?通过这个边界测试,可以知道,在[-128,127]这个区间内的Integer值可以直接用==进行判断,但是在这个区间之外的所有数据,结果就不一样了。因为在[-128,127]范围内,Integer对象是在IntegerCache.cache产生,会复用已有对象,在这个区间之外的数据,都会在堆上产生,并且不会复用已有对象,所以要注意这个“大坑”,以后还是尽量使用equals()方法进行判断。
字符串与基本数据类型转换
(1)将字符串变为int型

public class Package{
	 public static void main(String[] args){
  		String str = "123";
 		int num = Integer.parseInt(str);
  		System.out.println(num);
   	 }
}
D:\MySQL5.7\javawork>java Package
123

(2)将字符串变为double型

public class Package{
 	public static void main(String[] args){
 		 //纯数字
 		 String str = "123";
 		 //非纯数字
 		 String str1 = "123abc";
 		 double num = Double.parseDouble(str);
 		 double num1 = Double.parseDouble(str1);
 		 System.out.println(num);
 		 System.out.println(num1);
  	  }
}
D:\MySQL5.7\javawork>java Package
Exception in thread "main" java.lang.NumberFormatException: For input string: "123abc"
        at sun.misc.

在这里出错了,原因就在于字符串的组成有非数字,所以转换出现了问题,但是纯数字不影响。
(3)将字符串变为boolean型

public class Package{
 	public static void main(String[] args){
		//纯数字
  		String str = "123";
  		//非纯数字
  		String str1 = "123abc";
  		boolean num = Boolean.parseBoolean(str);
 		boolean num1 = Boolean.parseBoolean(str1);
 	        boolean num2 = Boolean.parseBoolean("TRUE");
  		System.out.println(num);
  		System.out.println(num1);
  		System.out.println(num2);
   	 }
}
D:\MySQL5.7\javawork>java Package
false
false
true

所以这里可以看到,字符串与boolean类型转换就不会受任何的影响,并且与"true, false"大小写无关,不论大小写,都可以得到正确的结果。
(4)基本数据类型转字符串
任何数据类型使用了"+"连接空白字符串就变成了字符串类型;使用String类中提供的valueOf()方法,不会产生垃圾。

public class Package{
 	public static void main(String[] args){
  		String str = String.valueOf(10);
 		System.out.println(str);
   	 }
}
D:\MySQL5.7\javawork>java Package
10
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值