2

假设我有一堂课如下:

class Apple {

    String apple;

    Apple(String apple) {
        this.apple = apple;
    }
}

是什么使以下代码为真?

public boolean result() {
    Apple a = new Apple("apple");
    Apple b = new Apple("apple");

    return a.apple == b.apple;
}

Java 是否会自动在我的对象实例中设置实习生字符串?

Java唯一不实习字符串的时间是使用创建它们的时候new String("...")吗?

编辑

感谢您的回答,这个问题的扩展就是说

Apple a = new Apple(new String("apple"));
Apple b = new Apple(new String("apple"));

使用相同的测试返回false 。

这是因为我将 String 的实例传递给构造函数,而不是 String 文字。

4

2 回答 2

4

Java 是否会自动在我的对象实例中设置实习生字符串?

关键是:当你首先创建时Apple a,JVM 提供了一个 String包含的实例"apple"String被添加到StringPool.

因此,当您创建第二个时Apple bString重用 ,然后您在a.appleandb.apple中具有相同的对象引用:

例子:

Apple a = new Apple("apple");
Apple b = new Apple(new String("apple"));

System.out.println(a.apple == b.apple);

输出:

false

Java 唯一不实习字符串的时候是使用 new String("...") 创建它们的时候吗?

如果将 String 对象与==对象引用进行比较,而不是内容。

比较String使用的内容String::equals()String::intern()

例子

    // declaration
    String a = "a";
    String b = "a";
    String c = new String("a");

    // check references 
    System.out.println("AB>>" + (a == b));  // true, a & b references same memory position
    System.out.println("AC>>" + (a == c));  // false, a & c are different strings
    // as logic states if a == b && a != c then b != c.

    // using equals
    System.out.println("ACe>" + (a.equals(c))); // true, because compares content!!!!
     
    // using intern()
    System.out.println("ABi>" + (a.intern() == b.intern()));  // true
    System.out.println("BCi>" + (b.intern() == c.intern()));  // true

相关问题

于 2016-07-12T10:03:51.517 回答
1

其中的字段apple是对Applea 的引用String

在您的情况下,该引用是指一个实习字符串,因为您已经Apple使用将被实习的字符串文字实例化了。

并且由于aandb是从相同的实习字符串创建的,因此与 .a.apple引用相同的字符串b.apple

如果您使用new String.

于 2016-07-12T10:03:16.773 回答