分析以上代码,它的执行结果是什么?
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); } }