8种基本类型的包装类和常量池简单介绍

22 篇文章 0 订阅

8种基本类型的包装类和对象池 
包装类:java提供的为原始数据类型的封装类,如:int(基本数据类型),Integer封装类。 
对象池:为了一定程度上减少频繁创建对象,将一些对象保存到一个”容器”中。Byte,Short,Integer,Long,Character。这5种整型的包装类的对象池范围在-128~127之间,也就是说, 
超出这个范围的对象都会开辟自己的堆内存。 
Boolean也实现了对象池技术。Double,Float两种浮点数类型的包装类则没有实现。 
String也实现了常量池技术。 
自动装箱拆箱技术 
JDK5.0及之后允许直接将基本数据类型的数据直接赋值给其对应地包装类。 
如:Integer i = 3;(这就是自动装箱) 
实际编译代码是:

Integer i=Integer.valueOf(3); 编译器自动转换 
1 Integer i = 10; //装箱 
int t = i; //拆箱,实际上执行了 int t = i.intValue();

public class Main {
    public static void main(String[] args) {
    //自动装箱
    Integer total = 99;
    //自定拆箱
    int totalprim = total;
    }
}

Integer total = 99; 
执行上面那句代码的时候,系统为我们执行了: 
Integer total = Integer.valueOf(99);

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("计算机");
      String s2 = s1.intern();
      String s3 = "计算机";
      System.out.println("s1 == s2? " + (s1 == s2));
      System.out.println("s3 == s2? " + (s3 == s2));
  }
s1 == s2? false
s3 == s2? true


在调用”ab”.intern()方法的时候会返回”ab”,但是这个方法会首先检查字符串池中是否有”ab”这个字符串,如果存在则返回这个字符串的引用,否则就将这个字符串添加到字符串池中,然会返回这个字符串的引用

参考: 
链接:https://www.jianshu.com/p/c7f47de2ee80 
https://blog.csdn.net/hp910315/article/details/48654777 
https://blog.csdn.net/zhouyunqun/article/details/78235770


--------------------- 

转载自:https://blog.csdn.net/qq_35495763/article/details/81106268

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值