
包装类的关系图
Boolean(boolean)

Character(char)

Byte/Short/Integer/Long/Float/Double

包装类的应用
包装类与基本数据类型的转换
1)jdk5 前的手动装箱和拆箱方式,装箱 :基本类型--->包装类型,反之,拆箱
2)jdk5 以后(含jdk5)的自动装箱和拆箱方式。自动装箱底层调用的是valueOf方法,比如Integer.valueOf()
java
public static void main(String[] args) {
int n = 10;
//jdk5以前手动装箱
Integer integer = new Integer(n);
Integer integer1 = integer.valueOf(n);
//jdk5以前手动拆箱
int i = integer.intValue();
//jdk5以后可以自动装箱和拆箱
Integer integer2 = n; //底层是使用Integer.valueOf(n)。可以通过debug查看
int n1 = integer2; //底层是使用intValue(n)。可以通过debug查看
}
自动装箱的几点说明:
-
由于包装器类引用可以为
null,所以自动装箱有可能会抛出一个NullPointerException异常:javaInteger n = null; System.out.println(2 * n); // Throws Nul1PointerException -
如果在一个条件表达式中混合使用Integer和Double类型,Integer值就会拆箱,提升为double,再装箱为Double:
javaInteger n = 1; Double x= 2.0; System.out.println(true ? n :x); // Prints 1.0 多种类型的数据混合运算/表达式时,系统首先会自动将所有数据转换成容量最大的那种数据类型 -
装箱和拆箱是编译器认可的,而不是虚拟机。编译器在生成类的字节码时,插入必要的方法调用。虚拟机只是执行这些字节码。
包装类的方法
包装类与string互转
java
public static void main(String[] args) {
//包装类->string
Integer i = 100; //自动装箱
//方式1
String str1 = i + ""; //i本身没有什么变化
//方式2
String s = i.toString();
//方式3
String s1 = String.valueOf(i);
//string->包装类
String str = "1236";
//方式1
int i1 = Integer.parseInt(str);
//方式2
Integer integer = new Integer(str); //底层还是调用parseInt方法
}
常用方法
JAVA
System.out.println(Integer.MIN_VALUE); //返回最小值
System.out.println(Integer.MAX_VALUE);//返回最大值
System.out.println(Character.isDigit('a'));//判断是不是数字
System.out.println(Character.isLetter('a'));//判断是不是字母
System.out.println(Character.isUpperCase('a'));//判断是不是大写
System.out.println(Character.isLowerCase('a'));//判断是不是小写
System.out.println(Character.isWhitespace('a'));//判断是不是空格
System.out.println(Character.toUpperCase('a'));//转成大写
System.out.println(Character.toLowerCase('a'));//转成小写
Integer的创建机制
java
public static void main(String[] args) {
Integer integer = new Integer(1);
Integer integer1 = new Integer(1);
System.out.println(integer == integer1); //两个都是new出来的对象,肯定不是同一对象。
/**
* 首先Integer i1 = 6 的底层是装箱使用的是Integer.valueOf(),
* 所以要想弄清i1和i2是否是同一对象,必须查看源码。从源码得知,i1和i2不是同一对象;
* 不清楚请弄清楚valueOf()的源码。
*/
Integer i1 = 6;
Integer i2 = 6;
System.out.println(i1 == i2); //true 是同一对象
/**
* 首先Integer i3 = 360 的底层是装箱使用的是Integer.valueOf(),
* 所以要想弄清i3和i4是否是同一对象,必须查看源码。从源码得知,i3和i4不是同一对象;
* 不清楚请弄清楚valueOf()的源码。
*/
Integer i3 = 360;
Integer i4 = 360;
System.out.println(i3 == i4); //false 不是同一对象
//只要有基本数据类型参与都是相等。
Integer i5 = 360;
int i6 = 360;
System.out.println(i5 == i6); //true
}
上边的示例一直强调逼逼着要弄清valueOf源码,追踪valueOf源码如下:
java
public static Integer valueOf(int i) {
//如果在这个范围内,不需要创建对象。IntegerCache.low = -128,IntegerCache.high=127
if (i >= IntegerCache.low && i <= IntegerCache.high)
//通过debug调试模式可以看出,IntegerCache.cache数组存储的是-128~127的值
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);//如果不再就得要创建对象了。
}
包装类常用方法:
compare
compareTo
equals
hashCode