从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

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

String str1="hello";

String str2=new String("hello");

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

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

 

 

原文链接:https://blog.csdn.net/qq_33642117/article/details/52214236

 

标签: Java, 字符串对象池, Java 字符串对象池, Java 字符串对象池的作用

仅有一条评论

  1. weihua

    一个博客能让人流连忘返,讲真,靠的是实力!

添加新评论