Java5.0开始,Java虚拟机在启动的时候回实例化9个对象池。这9个对象池分别用来存储8中基本类型的包装类对象和String对象,主要是为了效率问题。

大家应该知道,创建String对象有俩种办法,代码如下:

String str1="hello";

String str2=new String("hello");

   这俩种创建String对象的方法有什么区别吗?区别就在于第一种方法在对象池中取对象,第二种方法直接生成新的对象。

   当在程序中直接用双引号引起来一个字符串时,Java虚拟机(JVM)就到String的对象池中就去检查是否有一个值相同的对象。如果有,就取现成的对象;如果没有则在对象池中创建,并返回其引用。因此,可以发现下面的代码输出true

String str1="hello";

String str2="hello";

System.out.printn(str1==str2);//true

这说明str1str2指向同一个对象,因为它们都是在对象池中取到的,而下面的代码输出为false

String str1="hello";

String str2=new String("hello");

System.out.printn(str1==str2);//false

   因为在任何情况下,只要new一个String对象都是创建了新的对象。其他的基本类型包装类的对象池与此类似,工作原理是一样的。对象池的存在是为了避免频繁的创建和销毁对象而影响系统性能,那么自定义的类是否也可以使用对象池呢?当然可以,我这里就不写代码了~

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐