java字符串字面量是否生成String对象

来源:互联网 发布:软件小站的解压密码 编辑:程序博客网 时间:2024/05/16 19:19
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);    }}


1 0