概述
一、什么是包装类?
就是基本类型所对应的引用类型,包装类的默认值是null
基本数据类型 | 包装类型 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
boolean | Boolean |
char | Character |
基本类型存放在栈中,引用类型存放在堆中。
二、类型转换和装箱、拆箱:
装箱:把基本类型转换成引用类型 把它从栈中转到堆中。
装箱的两种方式:new Integer(i)、Integer.valueOf(i)
拆箱: 拆箱,引用类型转换成基本类型 把它从堆中转到栈中
jdk1.5后,还可以实现自动装箱和拆箱。
看代码:
package com.classes.wapperClass;
public class Demo01 {
public static void main(String[] args) {
//
类型转换:装箱,把基本类型转换成引用类型 把它从栈中转到堆中
int num1 = 18;
Integer integer1 = new Integer(num1);
Integer integer2 = Integer.valueOf(num1);
System.out.println("============装箱成功==================");
System.out.println(integer1);
System.out.println(integer2);
//
拆箱,引用类型转换成基本类型
Integer integer3 = new Integer(100);
int count = integer3.intValue();
System.out.println("============拆箱成功==================");
System.out.println(count);
//
jdk1.5之后,可以实现自动装箱、拆箱
//
自动装箱
int age1 = 30;
Integer integer4 = age1;
System.out.println("============自动装箱成功==================");
System.out.println(integer4);
//
自动拆箱
int age2 = integer4;
System.out.println("============自动拆箱成功==================");
System.out.println(age2);
}
}
运行结果。
调出.class文件可以发现自动装箱和拆箱的过程:
三、基本类型和字符串之间的转换。
直接看代码:
package com.classes.wapperClass;
public class Demo02 {
//
字符串和基本数据类型之间的转换
public static void main(String[] args) {
//
基本数据类型转换成字符串
System.out.println("-----------------基本数据类型转换成字符串----------------------");
//
1.使用+号
int n1 = 100;
String s1
= n1+"";
System.out.println(s1);
//
2 使用Integer中的toString方法
int n2 = 15;
String s2 = Integer.toString(n2);
System.out.println(s2);
//
还可以调用重写的toString方法,加了一个参数 int radix,表示进制
//
把整数n2转换成16进制,并以字符串形式输出
String s3 = Integer.toString(n2,16);
System.out.println(s3);
System.out.println("-----------------字符串转换成基本数据类型----------------------");
//
字符串转换成基本数据类型
//
使用parseXXX
String str = "150";
int n = Integer.parseInt(str);
System.out.println(n);
//
布尔值类型也可转换
String str1 = "true";
boolean b = Boolean.parseBoolean(str1);
}
}
运行结果:
特别注意,使用parseXXX将字符串转成基本数据类型时,字符串里的必须是数字,否则会抛出异常:
四、关于Integer缓冲区的问题:
先来看一段代码:
package com.classes.wapperClass;
public class Demo03 {
public static void main(String[] args) {
//
两个不同的对象,在堆中存放的地址不同 false 合理
Integer integer1 = new Integer(100);
Integer integer2 = new Integer(100);
System.out.println(integer1==integer2);
//
因为自动装箱引用的是Integer中的valueOf方法,在这个方法中本就定义了一个-127到128数组,100是从里面取的,所以为true.
Integer integer3 = 100;
Integer integer4 = 100;
System.out.println(integer3==integer4);
//
这里false是因为200超出了数组范围,开始引用new Integer(i)的方法,所以它们又不相等了
Integer integer5 = 200;
Integer integer6 = 200;
System.out.println(integer5==integer6);
}
}
运行结果:
第一个integer1和integer2因为是两个不同的对象,再堆中地址不同,所以flase,合理。
integer3和integer4ture的原因就跟Integer缓冲区有关了。
因为它使用的是自动装箱,而自动装箱的原理就是引用了Integer中的valueOf方法,所以我们可以看成这个样子。
我们调出valueOf的源码来看看:
在valueOf方法中:
而这个IntegerCache方法定义的是一个数组,
再回来看valueOf方法:
当我们的值等于100时,他直接IntegerCache方法中的数组取了一个100值赋给了 integer3和integer4,所以它们相等。
而integer5和integer6的200由于超出了范围,所以它仍然返回的时new Integer(200):
所以和 integer1、2一样,它们是两个不同的对象,所以不相等,flase。
最后
以上就是搞怪小霸王为你收集整理的Java常用类:包装类的全部内容,希望文章能够帮你解决Java常用类:包装类所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复