当前位置: 首页 > 知识库问答 >
问题:

静态最终字符串="某物"--静态有意义吗?

韦原
2023-03-14
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,因此两个变量引用同一个对象。说最终变量无法重新定义,在这种情况下静态单词完全没有用。我是不是没抓住重点?

还有几件事:

1 - 为什么显式调用字符串构造函数不会导致字符串被池化?上面的相同代码使用新的字符串(“你好”)打印

2 -池行为是字符串专有的吗?还有一些其他的不可变对象(比如BigInteger ),但是我认为这些都没有被池化...为什么?

谢谢,卡罗

共有3个答案

汲利
2023-03-14

静态意味着对于为该类创建的每个新对象,String 构造

闾丘玮
2023-03-14

在这种情况下,即使静态没有为您提供内存优势,您仍然可以以静态方式访问该字段,因此您不需要实例。例如,您经常使用一些URI,因此您创建以下类:

public class Uris
{
    public static final String GOOGLE = "http://google.com";
    public static final String BBC = "http://bbc.co.uk";
}

使用static,您可以只使用Uris。GOOGLE代替新的URI()。GOOGLE

禄和宜
2023-03-14

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

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

至于你的后续问题:

  1. Q: 为什么显式调用String构造函数不会导致String被池化?上面的相同代码使用新的String(“hello”)打印false

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

字符串池仅用于字符串文本,但当然还有其他缓存用于不同的用例。最显而易见的是用来优化int自动装箱的int缓存。

 类似资料:
  • } 当我做它将打印芒果,但它仍然在打印苹果。如果有人能帮助我只使用MOCKITO而不是PowerMock等。

  • 问题内容: 我找到了一个代码,它声明了如下代码 它们之间有什么区别或相同?还是与或不同? 问题答案: 完全没有区别。根据 Java语言规范的8.3.1-类-字段修饰符, 如果两个或多个(不同的)字段修饰符出现在字段声明中,则按惯例(尽管不是必需的),它们的出现顺序与上面FieldModifier生产中所示的顺序一致。 对于字段,所述生产按以下顺序列出修饰符: 对于方法:

  • 我们正在开发基于spring boot 2.5.6的支付应用程序。该应用程序托管在docker上,并在Java14上启动。我们创建了一个名为的抽象类,它是,包含两个变量和。所有枚举类都扩展了这个基类,并在其中定义常量。 这个决定是为了定制整个应用程序层中使用的枚举。你可以在下面看到一个例子: 该类在实体层中用作嵌入变量,如下所示: 系统工作得很好,但是发生了一些错误,ShapeEnum的字段。RE

  • 我有两个UnitTest项目为我的Android项目。一个用于JUnit测试,一个用于Android Unit测试。在JUnit测试项目中,我创建了一个类来访问或设置私有字段、方法或构造函数。(附言:对于那些对完整代码感到好奇的人,请告诉我,我会把它添加到这篇文章的底部。) 我也有UnitTets来测试这些私有方法的访问。现在,所有这些UnitTest都可以工作,接受一个:设置final stat

  • 问题内容: 关于我们教授给出的指导课程,我有一个简单的问题。我已经看过几次serialVersionUID,但是我没有什么用。 什么是利用程序中的? 问题答案: 该是一个通用版本标识符类。反序列化使用此数字来确保已加载的类与序列化的对象完全对应。如果未找到匹配项,则抛出。

  • 问题内容: 我一直想知道Java中的单例。按照惯例,单例设置如下: 最近,我切换到使用以下内容: 由于没有空检查,因此它更短,更快捷,而且打字对我来说比打字好。有什么理由不能使第二种方法成为主流呢? 问题答案: 第一个版本在第一次实际需要时创建实例,而第二个版本(较短的版本)在初始化类后立即运行构造函数 类或接口类型T将在以下任何一种首次出现之前立即初始化: T是一个类,并创建T的实例。 T是一个