Java对象池原理分析

来源:互联网 发布:两个字符串相似度算法 编辑:程序博客网 时间:2024/06/05 16:07

大家都知道,对于java中的String类型,运行下面两条语句,都能创建一个abc字符串对象。

String str1 = "abc";

String str2 = new String("abc");

但二者的原理却不同,上面一个语句是到字符串常量池中去取abc字符串,如果存在,直接返回引用,而如果不存在,则新建一个abc字符串,然后返回引用。而第二个语句不去检查该字符串是否已经存在于常量池中,直接去新建一个abc字符串,并返回引用。

下面,我模拟一个带对象池的Dog类,以展示对象池的机制和原理。String的对象池并不完全与之相同。

package com.js.Sth;/** * 对象池原理 * @author js */import java.util.HashSet;public class PoolTest {public static void main(String[] args) {//对象池中取Dog dog1 = Dog.newInstance("lele", 30);Dog dog2 = Dog.newInstance("lele", 30);//所以dog1==dog2//重新创建,所以dog1!=dog3Dog dog3 = new Dog("lele", 30);System.out.println(dog1==dog2);System.out.println(dog1==dog3);}}class Dog{private String name;private int age;//对象池private static HashSet<Dog> pool = new HashSet<Dog>();public Dog(String name,int age){this.name = name;this.age = age;}public static Dog newInstance(String name,int age){//循环遍历对象池for(Dog dog:pool){if(dog.name.equals(name)&&dog.age==age){return dog;}}//如果找不到值相同的对象,则创建一个Dog对象//并把它添加到对象池中返回该对象】Dog dog = new Dog(name, age);pool.add(dog);return dog;}}