Java对象池

作者:xcbeyond
疯狂源自梦想,技术成就辉煌!微信公众号:《程序猿技术大咖》号主,专注后端开发多年,拥有丰富的研发经验,乐于技术输出、分享,现阶段从事微服务架构项目的研发工作,涉及架构设计、技术选型、业务研发等工作。对于Java、微服务、数据库、Docker有深入了解,并有大量的调优经验。

  在JDK5.0里,JVM在启动的时候会实例化9个对象池,这9个对象池分别用来存储8种基本数据类型的包装类对象和String对象。当我们直接用8种基本类型的包装类的对象或用双引号括起来一个字符串时,JVM就要在其对象池里面去找是否有一个相同的对象,如果有,就直接从对象池中拿这个现成的对象,如果没有,就在对象池里面创建一个新的对象。
 1、基本类型的包装类对象池
 
    Integer i1 = 5;//5在对象池中取
    Integer i2 = 5;
    System.out.println(i1==i2);//true,i1和i2都是从对象池中取的同一个对象
 
而:
 
  Integer j1 = 200;//超过Integer对象池存放数的范围,即:直接赋给一个Integer对象
  Integer j2 = 200;
  System.out.println(j1==j2);//false

由于Integer对象池只存放从-128--127之间的整数,若超过这个范围,则直接创建一个新的Integer对象!
 
 类似还有Long、Byte、Short、Float……
2、String类
    创建String对象有两种方法:
     String str1 = "xcbeyond";
     String st2 = new String("xcbeyond");
      这两种不同的创建方法是有差别的,第一种方式是在对象池中拿对象,第二种方式是直接在堆内存空间创建一个新的对象。
 因此,就有System.out.println(str1==str2);//false
 
 总结:对象池是为了避免频繁的创建和销毁对象而影响系统性能,其实现了对象的共享。