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
总结:对象池是为了避免频繁的创建和销毁对象而影响系统性能,其实现了对象的共享。