大家都知道,对于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<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;
}
}
本文探讨了Java中String类型的两种创建方式及其背后的原理。一种是通过字符串常量池进行检索,另一种是直接新建对象。此外,还通过自定义Dog类来模拟对象池的机制,展示了如何实现对象复用。
1118

被折叠的 条评论
为什么被折叠?



