gpt4 book ai didi

Java:文字字符串

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:03:19 25 4
gpt4 key购买 nike

class A { 

String s4 = "abc";

static public void main(String[]args ) {

String s1 = "abc";
String s2 = "abc";
String s3 = new String("abc");
A o = new A();
String s5 = new String("def");

System.out.println("s1==s2 : " + (s1==s2));
System.out.println("s1==s1.intern : " + (s1==s1.intern()));
System.out.println("s1==s3 : " + (s1==s3));
System.out.println("s1.intern==s3.intern : " + (s1.intern()==s3.intern()));
System.out.println("s1==s4 : " + (s1==o.s4));
}
}

输出:

s1==s2 : true
s1==s1.intern : true
s1==s3 : false
s1.intern==s3.intern : true
s1==s4 : true

我的问题:

1. "String s1 = "abc" 会发生什么情况?我猜 String 对象是作为 interned 字符串添加到 String 类的池中的?它放在哪里?“永久generation"还是只是堆(作为 String 类实例的数据成员)?

2. "String s2 = "abc" 会发生什么?我猜没有创建任何对象。但这是否意味着 Java 解释器需要搜索所有 interned 字符串?这会导致任何性能问题?

3.似乎 String s3 = new String("abc") 没有使用 interned string。为什么?

4. String s5 = new String("def") 会创建任何新的驻留字符串吗?

最佳答案

  1. 编译器在常量池中为“abc”创建一个字符串对象,并在赋值语句的字节码中生成对它的引用。

  2. 参见 (1)。无需搜索;没有性能问题。

  3. 这会在运行时创建一个新的 String 对象,因为这是“new”运算符所做的:创建新对象。

  4. 是的,对于“def”,但由于 (3),还会在运行时创建一个新的 String。

3-4 处的 String 对象没有被驻留。

关于Java:文字字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10672402/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com