包装类(Wrapper)
1. 介绍
(1)针对八种基本数据类型相应的引用类型 --> 包装类
2. 分类和继承关系
基本数据类型 包装类 父类 boolean Boolean Object char Character Object byte Byte Number short Short Number int Integer Number long Long Number float Float Number double Double Number
一、包装类和基本数据类型 的相互转换(装箱和拆箱 )
(1)jdk5 前 的手动装箱和拆箱 方式, 装箱:基本类型->包装类型,反之,拆箱
(2)jdk5 以后 (含 jdk5)的自动装箱和拆箱 方式
(3)底层调用的方法
(4)下面以Integer
举例,其他包装类的方法类似,不一一举例
1. 装箱(int
--> Integer
)
int n = 10 ;
Integer integer = Integer . valueOf ( n) ;
Integer integer1 = new Integer ( n) ;
2. 拆箱(Integer
--> int
)
int n = 10 ;
Integer integer = Integer . valueOf ( n) ;
int n1 = integer. intValue ( ) ;
3. 自动装箱和插箱
int n = 10 ;
Integer integer = n;
int n1 = integer;
实现自动的原理:在底层会调用相应的方法
二、包装类和String 类 的相互转换
1. Integer
--> String
的三种方法
(1)使用字符串串拼接 (3)使用String.valueOf()
方法
String.valueOf()
方法在底层接收的是一个对象 ,而Integer
刚好就是一个对象
代码示例
Integer integer = 5 ;
String str1 = integer + "" ;
String str2 = integer. toString ( ) ;
String str3 = String . valueOf ( integer) ;
2. String
--> Integer
两种方法
(1)使用Integer.parseInt()
方法(自动装箱 )
解读:parseInt()
方法返回int
类型 ,本质还是把int
类型赋值给Integer
类型 ,实现了自动装箱
代码示例
String str = "123" ;
Integer integer1 = Integer . parseInt ( str) ;
Integer integer2 = new Integer ( str) ;
三、Integer
类和Character
类的一些常用方法
说明:下面举例说明,对于其他类型的大同小异
方法 描述 Integer.MIN_VALUE
返回整数的最小值 Integer.MAX_VALUE
返回整数的最大值 Character.isDigit(char)
判断字符是否为数字 Character.isLetter(char)
判断字符是否为字母 Character.isUpperCase(char)
判断字符是否为大写字母 Character.isLowerCase(char)
判断字符是否为小写字母 Character.isWhitespace(char)
判断字符是否为空格 Character.toUpperCase(char)
将字符转换为大写 字母 Character.toLowerCase(char)
将字符转换为小写 字母
代码示例
public class Test {
public static void main ( String [ ] args) {
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' ) ) ;
}
}
- 2147483648
2147483647
false
true
false
true
false
A
a
四、Integer
的创建机制底层源码探究
源码如下
public static Integer valueOf ( int i) {
if ( i >= IntegerCache . low && i <= IntegerCache . high)
return IntegerCache . cache[ i + ( - IntegerCache . low) ] ;
return new Integer ( i) ;
}
继续追源码,可以得到:low:-127、high:128
int
--> Integer
底层机制的解释
(1)值在 -128 --> 127
范围内会使用缓存池 ,当两个 Integer 对象的值在这个范围内时,它们会引用相同的缓存对象 (存储在Cache
数组中)
代码示例
(1)数据在范围内:引用相同的缓存对象
Integer integer1 = 1 ;
Integer integer2 = 1 ;
System . out. println ( integer1 == integer2) ;
true
(2)数据不再范围内:创建Integer
对象
Integer integer1 = 128 ;
Integer integer2 = 128 ;
System . out. println ( integer1 == integer2) ;
false
五、题目练习
1. 易错题
(1)第一题
Object obj1 = true ? new Integer ( 1 ) : new Double ( 2.0 ) ;
System . out. println ( obj1) ;
输出:1.0
解释:三元运算符看成一个整体 ,double
的优先级最高 ,所以输出double
(遵循自动类型转换中的自动提升原则 )
自动提升原则:表达式结果的类型自动提升为操作数中最大的类型
int result = true ? 1 : 2.5 ;
System . out. println ( result) ;
输出:1.0
(2)第二题
Object obj2;
if ( true ) {
obj2 = new Integer ( 1 ) ;
} else {
obj2 = new Double ( 2.0 ) ;
}
System . out. println ( obj2) ;
输出:1
2. 综合题
答案
总结
(1)如果是在范围内:是同一个对象
(2)如果超出范围或者new
:只要是创建了对象就不是同一个对象
(3)int
和Integer
:只要有基本数据类型,判断的是值是否相等