Java中的包装类
Java包装类
Java有两种数据类型,基本数据类型和引用数据类型,但是有时候我们会有这样的需求,用基本数据类型成员去做某些事,比如调用方法,但是基本数据类型并不是对象,无法满足我们的需求。
所有的基本类型都有一个与之对应的包装类,如下:
在这里就拿Integer /ˈɪntɪdʒər/类来举例子,先看看Integer类的构造方法
public Integer(int value)
public Integer(String s) throws NumberFormatException
从第一个构造方法可以知道,可以通过构造方法的形式将一个基本数据类型int转换为Integer类对象。
第二个构造方法可以知道,可以传一个字符串构成Integer类对象,但是这个字符串必须是由数字构成的字符串。
举例如下:
package com.qty4.demo;
/*
* @author F3ver1
* @date 2018/10/23 16:31
*/
public class Demo {
public static void main(String[] args) {
int a = 10;
Integer integer = new Integer(a);
Integer integer1 = new Integer(20);
Integer integer2 = new Integer("30");
System.out.println(integer);
System.out.println(integer1);
System.out.println(integer2);
}
}
结果打印:
10
20
30
如果把其中的String s换成不是纯数字构成字符串:
public class Demo {
public static void main(String[] args) {
Integer integer3 = new Integer("a3");
System.out.println(integer3);
}
}
结果会抛出java.lang.NumberFormatException 的异常,此时字符串无法被解析为整数,因此第二个构造方法传入的参数必须是纯数字的字符串。
基本数据类型转换为包装类的方法:
public static Integer valueOf(int i)
public static Integer valueOf(String s) throws NumberFormatException
public class Demo {
public static void main(String[] args) {
Integer integer = Integer.valueOf(100);
Integer integer1 = Integer.valueOf("100");
System.out.println(integer);
System.out.println(integer1);
}
}
结果:
100
100
这里同样不能传入非纯数字的字符串,否则就会抛出NumberFormatException异常。
那么包装类型转基本数据类型同样有如下方法:
public class Demo {
public static void main(String[] args) {
Integer integer = Integer.valueOf(100); //手动装箱
int i = integer.intValue(); //手动拆箱
System.out.println(i);
}
}
同时,Integer类也提供了int和String类之间的相互转换:
字符串转换为int:
public static int parseInt(String s)
public class Demo {
public static void main(String[] args) {
String str = "100";
int x = Integer.parseInt(str);
System.out.println(x);
}
}
而int转换为字符串利用String类中的valueOf()方法即可。
在这里基本数据类型转换为对应包装类也叫做“装箱操作”,包装类转换为对应基本数据类型叫“拆箱操作”,上述操作较为繁琐,JDK1.5后提供了自动装箱和自动拆箱操作。
public class Demo {
public static void main(String[] args) {
Integer a = 100; //实际上是Integer a = Integer.valueOf(100);
int b = a + 20; //实际上是先拆箱,int x = a.intValue();x与基本数据类型运算,得到120,再计算b=x;
System.out.println(b);
------------------------------------------------------------
Integer c = 100; //实际上是Integer c = Integer.valueOf(100);
Integer d = c + 20; //实际上是先拆箱,int x = c.intValue();x与基本数据类型运算,得到120,再进行自动装箱
//Integer d = y.valueOf(120);
System.out.println(d);
}
}
结果打印:
120
120
自动拆装箱的解释写在备注,其中x和y算作中间值,方便理解。
在这里写个常见问题
public class Demo {
public static void main(String[] args) {
Integer i1 = 127;
Integer i2 = 127;
System.out.println(i1==i2);
System.out.println(i1.equals(i2));
------------------------------------------------------------
Integer i3 = 200;
Integer i4 = 200;
System.out.println(i3==i4);
System.out.println(i3.equals(i4));
}
}
结果打印:
true
true
false
true
第一个为true,而第三个为false的原因在于,Java自动装箱规范要求介于-128~127之间为一个字节常量值,大于这个值将会保存在不同的对象中,因此前者为true,后者为false.
另外,如果Integer和Double同时使用于一个条件表达式,那么Integer会自动拆箱,提升为double,再自动装箱为Double,比如:
Integer i = 5;
Double j = 10.0;
System.out.println(i<j?i:j);
这里将打印:
5.0