public class StringTest {
public static void main(String[] args) {
String str1 = "abc";
String str2 = new String("abc");
System.out.println(str1 == str2);
}
}
分析以上代码,它的执行结果是什么?
false
显然他们分别创建了个String对象,并且str1和str2都获得了各自对象的引用,所以结果是不同的,但是在java 5.0及其以后的版本中,在创建该对象以前时,JVM会在String对象池中去搜索该字符串对象是否是被创建,如果已经创建,则直接返回一个引用,否则先创建对象再返回引用。
public class StringTest {
public static void main(String[] args) {
String str1 = "abc";
String str2 = new String("abc");
String str3 = "abc";
System.out.println(str1 == str2);
System.out.println(str1 == str3);
}
}
其结果是false true,说明str1和str3指向同一个对象,这个对象就是在对象池中,对象池的存在是为了避免频繁的创建和销毁对象而影响系统性能,那么自定义的类能否也使用对象池呢?如下代码:
import java.util.HashSet;
/**
* Created by wjz on 2017/3/12.
*/
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并加入pool
Dog dog = new Dog(name,age);
pool.add(dog);
return dog;
}
}
public class StringPoolTest {
public static void main(String[] args) {
//对象池中取
Dog dog1 = Dog.newInstance("lele", 30);
Dog dog2 = Dog.newInstance("lele", 30);
System.out.println(dog1 == dog2);
}
}