gpt4 book ai didi

Java 字符串和字符串池

转载 作者:行者123 更新时间:2023-11-30 06:38:46 24 4
gpt4 key购买 nike

public String makinStrings() {
String m = "Fred47";
String s = "Fred";
s = s + "47";
s = s.substring(0);
return s.toString();
}

代码创建了多少个对象?

我做了一个简单的测试:

public static void main(String[] args) {
String m = "a";
m += "bc";
String s1 = "mabc".substring(1);
String s2 = "abc";

System.out.println(m == "abc");
System.out.println(m == s1);
System.out.println(m == s2);
System.out.println(s1 == s2);
}

如果 m、s1、s2 指向同一个对象(“abc”),结果不应该是“true, true, true, true”吗?相反,结果是“假,假,假,假”!

最佳答案

在那种情况下,结果为真 - 但 ms1s2 都指的是不同的字符串。常量字符串表达式自动执行实习,并且可以通过调用 intern 显式调用方法,但它不会自动发生在字符串连接和子字符串中。

在 Sun 的 Java 7 实现中,x.substring(0) 实际上再次返回相同的引用 (x),但我不要相信 API 会保证这一点。

看看你的例子:

public String makinStrings() {
String m = "Fred47";
String s = "Fred";
s = s + "47";
s = s.substring(0);
return s.toString();
}

前两行要求内存中有两个字符串,但是具体什么时候保证创建对象我就不知道了。一旦它们已经被创建,它们就会一直存在——所以再次调用 makinStrings 将不会在这两行中创建更多。

字符串连接创建一个新的字符串对象。

substring 调用不会在我看过的实现中创建一个新的字符串对象 - 但它可以。

调用 s.toString() 不会创建一个新字符串(这在 JavaDoc 中指定)。

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

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