gpt4 book ai didi

java - static final String = "something"- static 有意义吗?

转载 作者:行者123 更新时间:2023-12-03 19:38:10 25 4
gpt4 key购买 nike

static final String = "something";

我想知道这样的声明在 Java 中是否具有某种真实的意义。我已经在代码中发现了数千次,但在研究和使用字符串时我了解到,声明一个 String 对象多少次都没有关系:如果你之前的某个类声明了这个字符串被合并和重用(我说的是在没有显式构造函数调用的情况下创建的字符串)

public class StringCompare {   
private void toCompare(String h) {
String x = "hello";
System.out.println( x == h);
}

public void compare() {
String h = "hello";
toCompare(h);
}
}

实际上,这段代码在调用比较时打印出 true,因此 2 个变量引用了同一个对象。表示无法重新定义 final 变量,static 词在这种情况下完全没用。我错过了重点吗?

还有一些事情:

1 - 为什么显式调用 String 构造函数不会导致 String 被合并?上面的相同代码使用 new String("hello") 打印 false

2 - 池行为是否保留给字符串?还有一些其他不可变对象(immutable对象)(如 BigInteger),但我认为这些对象没有合并……为什么?

谢谢,卡罗

最佳答案

尽管您对运行时行为的分析及其对字符串池的使用是正确的,但开发人员使用此模式的原因有几个。

  1. 它更清晰地传达了开发者的意图。具体来说,字符串现在有了一个比常量更清晰的名称,它传达了并非每个人都知道(或者他们不时忘记)的运行时行为。
  2. 如果开发人员想要更改源文件中的值,并且它已在多个地方使用,那么只有一个地方可以进行更改。
  3. 一旦决定使用变量,关键字 static 将意味着内存使用率较低。也就是说,只有一个字段用于存储引用,而不是每个对象实例一个字段。

关于您的后续问题:

  1. 问:为什么显式调用 String 构造函数不会导致 String 被合并?使用 new String("hello") 打印 false 的相同代码。

因为字符串池仅用于字符串文字,如 JLS 所述,调用构造函数不属于字符串文字。

  1. 问:池化行为是否保留给字符串?

字符串池仅用于字符串文字,但当然还有针对不同用例的其他缓存。想到的最明显的一个是用于优化整数自动装箱的整数缓存。

关于java - static final String = "something"- static 有意义吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26176802/

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