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 ),但是我认为这些都没有被池化...为什么?
谢谢,卡罗
静态
意味着对于为该类创建的每个新对象,String 构造
在这种情况下,即使静态没有为您提供内存优势,您仍然可以以静态方式访问该字段,因此您不需要实例。例如,您经常使用一些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
。
开发人员使用此模式有几个原因,即使您对运行时行为及其字符串池使用情况的分析是正确的。
至于你的后续问题:
因为字符串池仅用于字符串文本,如 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是一个