java中的增强包装类
基本数据类型与包装类型之间的对应关系
基本数据类型 | 包装类 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
char | Character |
float | Float |
double | Double |
boolean | Boolean |
为什么要引入包装类:
在java中包含了8中基本数据类型,但是这8种基本数据类型不支持面向对象的编程机制。在简单的有效数据处理时,基本类型非常方便。但是除了基本类型之外的所有引用类型都继承了Object类,都可以当成Object类型变量使用。但基本类型的变量就不可以,如过一个方法需要Object类型的参数,但实际需要的是数字类型的数值,这就不太好处理。不过不用担心,java引用8种基本类型对应的8种包装类就可以很好的解决这个问题。
自动装箱与自动拆箱
自动装箱(Autoboxing)是指把一个基本类型的变量直接赋值给包装类变量,自动拆箱(AutoUnboxing)是指把包装类对象直接赋值给一个基本类型变量。下面示范一下自动装箱和自动拆箱的代码:
package com.day0719;
/**
* @Author: Administrator
* @CreateTime: 2019-07-20 11:00
*/
public class demo03 {
public static void main(String[] args) {
//把一个基本类型直接赋值给包装类
int a = 321;
Integer inObj = a;
//把一个布尔类型的变量赋值给Object类型的变量
Object boolObj = true;
//把一个Internet类型赋值给int类型:
Integer b = 321;
int c = b;
}
}
注意:自动装箱和自动拆箱是必须注意类型匹配,只有在对应的基本类型和包装类型之间才可以进行转换。
包装类型实现基本类型和基本类型变量和字符串之间的转换
把字符串值转换成基本类型的值有两种方式:
1.利用包装类提供的parseXxx(String str)静态方法(除了Character之外所有的包装类都提供了该方法)
2.利用包装类提供的Xxx(String str)构造器
示例代码如下:
String str1 = "321";
String str2 = "3.21";
String str3 = "true";
//将字符串str1通过以下两种方式转换成基本类型int
int i1 = Integer.parseInt(str1);
int i2 = new Integer(str1);
//将字符串str2转换成基本类型float类型
float f1 = Float.parseFloat(str2);
float f2 = new Float(str2);
//将字符串转换成布尔类型
boolean b1 = Boolean.parseBoolean(str3);
boolean b2 = new Boolean(str3);
示范了int和float其余类型相同,值得注意的是,将字符串转换为布尔类型时,只有当字符串是“true”时,转换后的布尔类型才为true,其他字符串全为false。
将基本类型转换成字符串两种方式:
1.利用String类的方法valueof(Xxx);
2.将基本类型与“”相连接。
示范代码如下:
int a = 8;
String str = String.valueOf(21);
String str1 = String.valueOf(a);
String str2 = 321+"";
两个包装类型的实例比较
1.因为包装类型是引用类型,所以:
System.out.println((new Integer(2))==(new Integer(2))); //false
System.out.println((new Integer(2)).equals(new Integer(2))); //true
但是通过自动装箱(就是直接把一个基本类型值赋值给一个包装类型的实例),就会出现一些特别的情形
//通过自动装箱给包装类赋值
Integer in1 = 2;
Integer in2 = 2;
System.out.println(in1 == in2);//true
Integer in3 = 128;
Integer in4 = 128;
System.out.println(in3 == in4);//false
会发现当将两个 2 自动装箱后比较得到的是 true,而将两个 128 自动装箱后比较会得到 false。
出现这种情况是以为java的integer类的设计有关,有兴趣的可以查看integer的源代码中存储原理。
大概就是说,如果将一个 -128到127 的数自动装箱后,比较是true。如果不在 -128到127 之间的数,就会返回false。
比较不在 -128到127 之间的自动装箱实例或者new出来的包装类实例
在jdk7为所有包装类提供了compare(Xxx val1, Xxx val2)这个静态方法进行比较:
System.out.println(Integer.compare((new Integer(2)),(new Integer(2)))); //0
//通过自动装箱给包装类赋值
Integer in3 = 128;
Integer in4 = 128;
System.out.println(in3 == in4);//false
System.out.println(Integer.compare(in3,in4)); //0