包装类的分类
- 针对八种基本数据类型相应的引用类型-包装类
- 有了类的特点,就可以调用对应的类中的方法
装箱和拆箱
Java是一种面向对象的编程语言,学习Java时就被明确灌输了一个概念:OOP,即面向对象编程。一切皆对象。但是基本类型是不具备Java中对象的某些特征,对象内部可以封装一系列属性和行为,但是这些在基本数据类型中都无法满足,所以对应的包装类型就应运而生了。也就是说单独的一个 int a = 100;那么这个a它只能是代表一个值,并无法把它当作一个对象来操作。
而装箱就是把 值类型变成引用类型的一个过程,拆箱就是把一个引用类型重新变成值类型的过程。只有装过箱的才能拆箱
jdk5以前是需要手动装箱拆箱的:
演示:手动装拆箱
public class test1 {
public static void main(String []args){
int a = 100;
//手动装箱
Integer integer = new Integer(a);//第一种
Integer integer1 = Integer.valueOf(a);//第二种
System.out.println(integer);//输出100
System.out.println(integer1);//输出100
//手动拆箱
int b = integer.intValue();
System.out.println(b);//输出100
}
}
运行结果:
100
100
100
由运行结果可以看出,所谓装箱拆箱,就是把一个基本类型变成引用类型的,然后又从引用类型变成基本类型的一种方式。
之所以要这样玩,是为了可以使用引用类型的方法等等…,但所保存的值是不会变化的
jdk5以后就是自动装拆箱了
演示:
public class test1 {
public static void main(String []args){
int a = 100;
//自动装箱
Integer integer = a;//其实底层还是使用Integer的方法实现的只不过省略了
System.out.println(a);
//自动拆箱
int b = integer;
System.out.println(b);//同理也是使用的方法,但是省略了
}
}
运行结果:
100
100
其他的包装类也是类似的
包装类小测试
- 下面代码正确吗
Double d = 100d;
Float f = 1.5f;
正确,对包装类的自动装箱 等同于调用包装类的valueOf();方法
- 下面代码输出结果是什么
Object obj = true? new Integer(1) : new Double(2.0);
System.out.println(obj);
三元运算符,当为真是走第一个 为假时走第二个 所以走new Integer(1),而又因为当两种数据类型在进行比较时,会自动转换成比较大的类型,所以 1 会变成1.0,输出结果1.0
- 下面代码输出结果是什么
Object obj2;
if(true){
obj2 = new Ineger(1);
}else{
obj2 = new Double(2.0);}
System.out.pritln(obj2)
布尔值为真,走obj2 = new Ineger(1);这里是向上转型,所以输出 1
基本数据的包装类型与String类型的相互转换
把Intger类型转成String类型
public class test1 {
public static void main(String []args){
Integer n1 = 12345;
String s1 = n1.toString();// 第一种使用toString方法
System.out.println(s1);
String s2 =String.valueOf(n1);//第二种 使用valueOf方法
System.out.println(s2);
String s3 = n1+" ";
System.out.println(s3);//第三种使用+" "
}
}
String 类型转成 Intger
public class test1 {
public static void main(String []args){
String s1 = "234";
Integer i = new Integer(s1);//第一种使用默认自动装箱
System.out.println(i);
Integer i2 = Integer.valueOf(s1);//第二种 使用valueOf方法
System.out.println(i2);
}
}
Intger和Character的常用方法
Intger常见面试题
1.看以下代码输出什么
Integer i = new Integer(1);
Integer j = new Integer(1);
System.out.println(i == j);
Integer m = 1;
Integer n = 1;
System.out.println(m == n);
Integer x = 128;
Integer y = 128;
System.out.println(x == y);
首先看第一个 ,由于 i和j都是new出来的对象,所以==用在比较对象时比较的是地址,所以是第一个输出false
第二个是自动装箱等同于调用valueOf(int x)方法,在这个方法的源码中如果传递进来的值>= -128 且 <= 127时就直接返回值
如果超出这个范围就new一个Intger对象保存。而1在这个范围之内,所以不会返回对象,因为输出true
第三个,同理还是会调用valueOf(int x)方法,但由于128超出了valueOf(int x)里规定的范围所以会返回创建对象,因为又是对比地址,所以返回false,
2.下列代码会输出什么
Intger a = 127;
int b = 127;
System.out.println(a == b);
Intger c = 128;
int d = 128;
System.out.println(c == d);
在 == 的对比中,如果是基本类型和和基本类型的包装类进行对比,那么就是值对比
所以两个都是true;