Java-8种基本类型的包装类和常量池简单介绍
包装类:Java对一些基础数据类型提供了封装类,如:int对应的封装类为 Integer封装类
对象池:为了一定程度上减少频繁创建对象,将一些对象保存到一个”容器”中。
Byte,Short,Integer,Long,Character。
这5种整型的包装类的对象池范围在-128~127之间,也就是说,
超出这个范围的对象都会开辟自己的堆内存。
Boolean也实现了对象池技术。Double,Float两种浮点数类型的包装类则没有实现。
String也实现了常量池技术。
自动装箱拆箱技术
JDK5.0及之后允许直接将基本数据类型的数据直接赋值给其对应地包装类。
如:Integer i = 88;(这就是自动装箱)
实际编译代码是:Integer i=Integer.valueOf(88); 编译器自动转换
Integer i = 88; //装箱
int t = i; //拆箱,实际上执行了 int t = i.intValue();
public class Main {
public static void main(String[] args) {
//自动装箱
Integer total = 100;
//自定拆箱
int totalprim = total;
}
}
Integer total = 100;
执行上面那句代码的时候,系统为我们执行了:
Integer total = Integer.valueOf(100);
int totalprim = total;
执行上面那句代码的时候,系统为我们执行了:
int totalprim = total.intValue();
我们现在就以Integer为例,来分析一下它的源码:
1、首先来看看Integer.valueOf函数
public static Integer valueOf(int i) {
return i >= 128 || i < -128 ? new Integer(i) : SMALL_VALUES[i + 128];
}
它会首先判断i的大小:如果i小于-128或者大于等于128,就创建一个Integer对象,否则执行SMALL_VALUES[i + 128]
下面看看SMALL_VALUES[i + 128]是什么东西:
private static final Integer[] SMALL_VALUES = new Integer[256];
它是一个静态的Integer数组对象,也就是说最终valueOf返回的都是一个Integer对象。
即Byte,Short,Integer,Long,Boolean;Character为字符型:常量池数值范围为0~127
这5种包装类默认创建了数值[-128,127]的相应类型的缓存数据,但是超出此范围仍然会去创建新的对象。
两种浮点数类型的包装类Float,Double并没有实现常量池技术。
运行期间也可能将新的常量放入池中,这种特性被开发人员利用比较多的就是String类的intern()方法。
String的intern()方法会查找在常量池中是否存在一份equal相等的字符串,如果有则返回该字符串的引用,如果没有则添加自己的字符串进入常量池。
public static void main(String[] args) {
String s1 = new String("Java爱好者");
String s2 = s1.intern();
String s3 = "Java爱好者";
System.out.println("s1 == s2? " + (s1 == s2));
System.out.println("s3 == s2? " + (s3 == s2));
}
s1 == s2? false
s3 == s2? true
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。