Java主要有8个基本数据类型,分别是boolean,char,short,int,double,float,long,byte。其对应的包装类分别是Boolean,Character,Short,Integer,Double,Float,Long,Byte。
因为Java是面向对象语言,而这8个基本数据类型又违背了面向对象,所以增加了对应的包装类(自己猜应该是这个原因)。
说到包装类就不得不说什么是自动装箱,什么是自动拆箱。
- 自动装箱。自动装箱即自动将基本数据类型转换成包装类型
Integer i1 = new Integer(8);
Integer i2 = Integer.valueOf(8);
- 自动拆箱。自动拆箱即自动将包装类型转换成基本数据类型
int i5 = i3.intValue();
而且想要在集合框架中使用这些类型,必须使用包装类,不能使用基本数据类型
// 编译报错
List<int> list = new ArrayList<>();
// 编译通过
List<Integer> list = new ArrayList<>();
数据类型是不支持直接转换的,可以通过包装类转换,例如:
int i1=1;
String str = Integer.toString(i1);
//字符串转换为基本数据类型
//通过paerInt方法
int i2 = Integer.parseInt(str);
//通过valeOf,先把字符串转换为包装类然后通过自动拆箱
int t3 = Integer.valueOf(str);
但是在Integer这儿有一个小知识点:
public static void main(String[] args) {
// TODO Auto-generated method stub
Integer one = new Integer(100);
Integer two = new Integer(100);
//one和对two是两个不同的对象,==在比较对象时比较的是内存地址,两个是不同的空间,放的值相同
System.out.println("one==two:" + (one == two));
//自动装箱
Integer three = 100;
// Integer three=Integer.valueOf(100) 这时缓存区没有,就会构造一个
//自动拆箱
System.out.println("three==100:" + (three == 100));
Integer four = 100;
/* 实际执行的是 Integer four=Integer.valueOf(100); 这时缓存区有,就会直接取
* Java为了提高拆装箱效率,在执行过程中提供了一个缓存区(对象池)【类似于常量数组】,
* 如果传入的参数是,-128<参数<127会直接去缓存查找数据,如果有久直接产生,如果没有就隐式调用new方法产生
*/
System.out.println("three==four:" + (three == four));
Integer five = 200;
System.out.println("five==200:" + (five == 200));
Integer six = 200;
//注:这里为200,超出了缓存区范围,所以都需要构建
System.out.println("five==six:" + (five == six));
/*
* 输出:
* one==two:false
three==100:true
three==four:true
five==200:true
five==six:false
*/
}