基本数据类型 | 位数 | 包装类 |
---|---|---|
byte | 8 | Byte |
short | 16 | Short |
int | 32 | Integer |
long | 64 | Long |
float | 32 | Float |
double | 64 | Double |
char | 16 | Character |
boolean | 32 | Boolean |
PS:关于布尔类型(boolean)是32位的说法,理由来源是《Java虚拟机规范》一书,书中说到:“虽然定义了boolean这种数据类型,但是只对它提供了非常有限的支持。在Java虚拟机中没有任何供boolean值专用的字节码指令,Java语言表达式所操作的boolean值,在编译之后都使用Java虚拟机中的int数据类型来代替,而boolean数组将会被编码成Java虚拟机的byte数组,每个元素boolean元素占8位”。这样我们可以得出boolean类型占了单独使用是4个字节,在数组中又是1个字节。
一、包装类的理解
为了满足Java语言面向对象的这一特性,上述基本数据类型中的每一个在java.lang包中都有一个包装类,即将每个基本类型都包装成了一个类。
public static void main(String[] args) {
//包装类的一些特性
//1.所有包装类都可以将与之对应的基本数据类型作为参数来创建它们的实例对象
Integer a = new Integer(100);
Double b = new Double(100.00);
Character c = new Character('A');
Boolean d = new Boolean(true);
System.out.println(a+" "+ b+" "+c+" "+d);//100 100.0 A true
//2.除了Character类之外,其他包装类都可以将一个字符串作为参数来构造它们的实例
Integer a1 = new Integer("100");
Double b1 = new Double("100.00");
Boolean d1 = new Boolean("true");
System.out.println(a1+" "+ b1+" "+d1);//100 100.0 true
/*3.Boolean类的构造方法参数为String类型时:
*若该字符串为true(不论大小写),则该对象表示true,否则表示false
*/
Boolean d2 = new Boolean("True");
Boolean d3 = new Boolean("TRUE");
Boolean d4 = new Boolean("hello");
System.out.println(d2+" "+d3+" "+d4);//true true false
/*4.当包装类Number构造方法的参数为String类型时,字符串不能为null
*否则会抛出数字格式异常。
*该字符串必须能够解析为基本类型的数据。
*/
Integer a2 = new Integer("");//NumberFormatException: For input string: ""
Integer a3 = new Integer(null);//NumberFormatException: null
Integer a4 = new Integer("abc");//NumberFormatException: For input string: "abc"
}
二、包装类的作用
- 集合中不允许存放基本数据类型,此时就需要使用包装类。
- 基本数据类型对应的包装类类型,提供了一系列实用的对象操作,如类型转换、进制转换等等。
//获取基本数据类型的相关属性
System.out.println(Byte.MIN_VALUE);//-128
System.out.println(Byte.MAX_VALUE);//127
System.out.println(Byte.SIZE);//8
/*
* 包装类型的一些实用操作,如类型转换、进制转换等
*/
//调用构造器将int类型转换为Integer类型,调用intValue方法将integer类型转换为int类型
Integer in1 = new Integer(100);
int in2 = in1.intValue();
//将字符串转换为十进制数的int数,常用于任意进制数转换为十进制数
int num1 = Integer.parseInt("100");
System.out.println(num1); //100
//将字符串按任意进制转换为int数
int num2 = Integer.parseInt("100", 8);
int num3 = Integer.parseInt("ff", 16);
System.out.println(num2); //64
System.out.println(num3);
//将int数转换为对应的String类型的数
String s1 = Integer.toString(100);
System.out.println(s1);//100
//将int数转换为任意进制的String类型的数,常用于十进制数转换为任意进制数
String s2 = Integer.toString(100,8);
String s3 = Integer.toString(100,16);
System.out.println(s2);//144
System.out.println(s3);//64
从JDK1.5就开始引入了自动拆装箱的功能,系统将自动进行基本数据类型和与之相对应的包装类型之间的转换,我们使用起来更加方便。
/** 装箱操作:
基本数据类型------->包装类型
1:可以使用构造器
2:可以使用包装类提供的valueOf(基本数据类型 变量)
拆箱操作:
包装类型------>基本数据类型
1:调用包装类里的typeValue()
数字字符串---->包装类
1: static type parseType(String value)
*/
/*
* 手动装箱和拆箱
*/
//将int的值10装箱成Integer类型的对象
Integer n1 = new Integer(10);
Integer n2 = Integer.valueOf(10);
//将n1拆箱成基本数据类型
int num1 = n1.intValue();
/*
* jdk1.5以后可以自动拆装箱
*/
//将double的值3.14装箱成Double对象
Double d1 = 3.14;//自动装箱
//将d1拆箱成基本数据类型
double d2 = d1;//自动拆箱
/*
*引用数据类型是不可以使用运算符来进行运算的
*/
Integer i1 = 1000;//装箱
Integer i2 = 500;//装箱
Integer i3 = i1+i2;//编译期间,编译器先拆箱再运算,然后再装箱成对象给i3
System.out.println(i3);//1500
三、包装类常量池
我理解的常量池,就是为了一定程度上减少频繁创建对象而将一些对象保存到一个"容器"中。包装类常量池就是,当-128~127这个范围内的整数进行自动装箱操作时,装箱后的对象会存储在包装类常量池中,并且只能存储有且只有一个相同值的对象。
包装类Byte,Short,Integer,Long对应的常量池的范围是:-128~127
浮点数对应的包装类Float和Double没有常量池
字符类型的包装类Character的常量池的范围:0~127
布尔类型的包装类Boolean的常量池:true和false
- 包装类中”==“与equals的用法比较:
包装类中的equals方法和String类一样,都是重写了Object类中的equals方法,因此比较的是内容而不是地址,而==比较的依然是引用变量的地址,只是当包装类型和与之相对应的基本类型进行= =比较时会先做自动拆箱处理。
Integer n1 = 1;//自动装箱
Integer n2 = 1;//自动装箱
System.out.println(n1==n2);//使用“==”比较地址值,true,说明n1,n2指向同一个对象
Integer n3=new Integer(1);//这里的“1”在堆中,上面的“1”在常量池中
System.out.println(n1==n3);//查看n3和n2是不是同一个对象,false