一、基本数据类型的局限
在java中一切皆对象,但是8种基本数据类型除外,这就导致了一些问题。
- 基本数据类型与引用数据类型不可相互赋值,不可相互比较
- 有些java类只能处理引用数据类型
二、什么是包装类
Java在java.lang包中提供了8个类代表8种基本数据类型
注1:java.lang是Java的核心包,使用其中的类可以不需要显示引用,eg:String
注2:包装类同String类一样,具有不可变性
三、包装类的实例化
实例化的方法
1.使用包装类的构造方法
除了Character类,其他包装类都提供了两种构造方法
public class Demo
{
public static void main(String[] args)
{
Integer i1 = new Integer(200);
//第一种使用与包装类对应的基本数据类型,比如说Integer对应int,所以使用200
Integer i2 = new Integer("200");
//第二种使用字符串,但字符串里的内容必须是数字,否则报错
Boolean b1 = new Boolean(true);
Boolean b2 = new Boolean("TUre");
//对于Boolean包装类字符串形式的true或false不区分大小写
Boolean b3 = new Boolean("FalTU"); //结果为false
//如果输入了其他字符串结果就为false
//字符的包装类的构造方法只有这一种写法
Character ch = new Character('a');
}
}
2.调用包装类的valueOf()方法
public class Demo
{
public static void main(String[] args)
{
Integer i1 = Integer.valueOf(200)
Integer i2 = Integer.valueOf("200");
}
}
3.构造方法与valueOf()的区别
- new关键字总是会创建一个新的对象
- valueOf()方法会缓存范围在-128到127之间的整型数值(int、long、byte、short)
Integer n1 = new Integer(300);
Integer n2 = new Integer(300);
System.out.println(n1 == n2); //false 表示n1和n2所保存的堆内存地址不同
Integer n3 = Integer.valueOf(100);//没超过127
Integer n4 = Integer.valueOf(100);//没超过127
System.out.println(n3 == n4); //true
/*
*java中为了提高效率,在使用Integer时,如果新建的Integer对象是小于128的,
*会直接从缓存中取对应的地址值复制给这个变量,所以n3和n4内存地址是一样的
*/
Integer n5 = Integer.valueOf(200);//超过127
Integer n6 = Integer.valueOf(200);//超过127
System.out.println(n5 == n6); //false 超过127,ValueOf不会进行缓存
四、包装类的基本使用
这里会介绍一些包装类常用的属性和方法,其他的方法可以在需要使用的时候去查文档
1.数字包装类
数字包装类有:Byte、Short、Integer、Long、Float、Double
每个数字包装类都提供了两种方法:
- xxxValue()
- parseXxx()
///xxxValue(),将包装类转换成相应的基本数据类型
Integer n1 = new Integer(100);
int num1 = n1.intValue();
Double d2 = new Double("12.34");
double num2 = d2.doubleValue();
//parseXxx(),将字符串转换成相应的包装类,这个方法的参数是字符串
int num3 = Integer.parseInt("123");
double num4 = Double.parseDouble("12.34");
每个数字包装类还提供了一些常量,表示这些数字的范围
Integer.MAX_VALUE //127
Integer.MIN_VALUE //-128
Double.MAX_VALUE //2147483647
2.字符包装类(Character)
常用方法:
//isDigit() 是否为数字
System.out.println(Character.isDigit("1")); //true
System.out.println(Character.isDigit("a")); //false
//isLowerCase() 是否是小写
//isUpperCase() 是否是大写
//toUpperCase() 变成大写
//toLowerCase() 变成小写
System.out.println(Character.toUpperCase("a")); //A
3.布尔包装类(Boolean)
Boolean包装类有两个常量
//Boolean.TURE
//Boolean.FALSE
Boolean b1 = Boolean.TURE;
Boolean b2 = Boolean.FALSE;
//这里涉及自动装箱的原理,后面会讲
System.out.println(b1.booleanValue());//true
System.out.println(b2.booleanValue());//false
五、自动装箱与自动拆箱
1.基本概念
基本数据类型与对应的包装之间自动互相转换,该转换是在编译时执行的
- 装箱:基本数据类型转换成对应的包装类
- 拆箱:包装类能转换成对应的基本数据类型
2.没有自动装箱/拆箱会怎样
包装类变量保存的是地址,不能直接进行算术运算,需要借助一些方法
Integer add(Integer num1,Integer num2)
{
int n1 = num1.intValue();
int n2 = num2.intValue();
return new Integer(n1 + n2);
}
/*
*这里进行包装类的加法操作写起来十分繁琐
*如果再按前面说的使用构造方法或者valueOf()去定义两个实参包装类那么就显得更繁琐了
*为此引入了自动装箱与自动拆箱的概念
*/
3.自动装箱/拆箱的实例
public class Demo
{
static int add(int num1,int num2) //设为静态方法,可以不用new一个Demo对象直接调用
{
return num1 + num2;
}
public static void main(String[] args)
{
Integer n1 = 100; //自动装箱 这里基本数据类型自动包装成了它所对应的包装类
int n2 = n1; //自动拆箱 这里包装类自动拆箱,直接把堆内存中的值赋值给对应的基本数据类型
Integer sum = add(100,200); //300
}
}
错误例子:
Integer n = null;
int a = n; //运行时抛出异常
//包装类变量为null,拆箱会报错
4.再谈比较运算符
- 只有==,!=能用于基本数据类型和引用数据类型,其他的只能用于基本数据类型。但==,!=用于引用数据类型,比较的是地址。
- 包装类之间比较大小时,会自动拆箱
- 包装类的值是自动装箱获得时,比较时需要考虑缓存
Integer n1 = 100;
Integer n2 = 120;
System.out.println(n1 < n2); //自动拆箱,true
Integer n3 = 200;
Integer n4 = 200;
System.out.println(n3 == n4);
//false ==比较引用数据类型比较的是内存地址
Integer n5 = 100;
Integer n6 = 100;
System.out.println(n3 == n4);
//true 包装类的值是自动装箱获得时,需要考虑缓存,同valueOf()