包装类型
1、Java数据类型:基本+引用
基本数据类型:byte,short,int,long , boolean , double , char
引用类型:所有class 和 interface 类型
注:引用类型可以赋值为null
,表示空,但基本类型不能赋值为null
String str1 = null; (String是java中字符串类型,是一种引用类型)
int str2 = null; 错误,基本类型不能赋值为null
2、如何将一个基本类型视为对象呢
1、定义一个Integer类,其只包含一个实例字段int,该Integer类就可以视为int的包装类(Wrapper Class)
2、Integer类编译器核心库已经写好了,我们直接调用,我们可以把int和Integer互相转换
Integer n = null; Integer n2 = new Integer(99); int n3 = n2.intValue();
3、在日常开发中,包装类型非常有用,java核心库为每种基本类型都提供了对应的包装类型:
基本类型 | 对应的引用类型 |
---|---|
boolean | java.lang.Boolean |
byte | java.lang.Byte |
short | java.lang.Short |
int | java.lang.Integer |
long | java.lang.Long |
float | java.lang.Float |
double | java.lang.Double |
char | java.lang.Character |
我们直接用就好,不用定义了
int i = 100; // 通过new操作符创建Integer实例(不推荐使用,会有编译警告): Integer n1 = new Integer(i); // 通过静态方法valueOf(int)创建Integer实例: Integer n2 = Integer.valueOf(i); // 通过静态方法valueOf(String)创建Integer实例: Integer n3 = Integer.valueOf("100"); System.out.println(n3.intValue());
3、int 和 Integer 可以互相转换
1、Integer类中定义了很多方法,我不列举了,有兴趣的可以自己去看看
2、
int i = 10; Integer n1 = Integer.valueOf(i); System.out.println(n1);
3、装箱和拆箱
1、自动装箱(Auto Boxing)和 自动拆箱(Auto Unboxing)
Integer n = 100; int x = n;
int
变为Integer
的赋值写法,称为自动装箱
Integer变为int的赋值写法,称为自动拆箱
目的:为减少代码
2、装箱和拆箱会影响代码的执行效率,因为编译后的class
代码是严格区分基本类型和引用类型的。并且,自动拆箱执行时可能会报空指针异常NullPointerException
:
4、不变类
1、通过查看Integer
的源码可知,所有的包装类型都是不变类核心代码如下
2、对两个Integer
实例进行比较要特别注意:绝对不能用==
比较,因为Integer
是引用类型,必须使用equals()
比较:
详细解释:==
比较,较小的两个相同的Integer
返回true
,较大的两个相同的Integer
返回false
,这是因为Integer
是不变类,编译器把Integer x = 127;
自动变为Integer x = Integer.valueOf(127);
,为了节省内存,Integer.valueOf()
对于较小的数,始终返回相同的实例,因此,==
比较“恰好”为true
,但我们绝不能因为Java标准库的Integer
内部有缓存优化就用==
比较,必须用equals()
方法比较两个Integer
3、因为Integer.valueOf()
可能始终返回同一个Integer
实例,因此,在我们自己创建Integer
的时候,以下两种方法:
-
方法1:
Integer n = new Integer(100);
-
方法2:
Integer n = Integer.valueOf(100);
方法2更好,因为方法1总是创建新的Integer
实例,方法2把内部优化留给Integer
的实现者去做,即使在当前版本没有优化,也有可能在下一个版本进行优化。
我们把能创建“新”对象的静态方法称为静态工厂方法。Integer.valueOf()
就是静态工厂方法,它尽可能地返回缓存的实例以节省内存。
注:创建新对象时,优先选用静态工厂方法而不是new操作符。
4、Integer还提供了进制转换等大量方法
parseInt()方法就可以把字符串解析成一个整数,具体不多赘述了