Java对象池原理分析

大家都知道,对于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!=dog3
		Dog 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 pool = new HashSet();
	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;
	}
}


你可能感兴趣的:(Java)