0

我找不到这个问题,对不起,如果我的搜索技巧错过了!

在 Java 8 之前,我认为声明如下:

...
public final String someString = "Hi";
public final int someInt = 17;

最好声明为:

...
public static final String someString = "Hi";
public static final int someInt = 17;

与 post PermGen(现在的 Metaspace)还有区别吗?对这种差异有什么-XX:+UseStringDeduplication影响(无论如何对于字符串)?

4

1 回答 1

2

包含对对象的引用的变量对被引用的对象没有影响。如果有的话会很奇怪,因为可以有很多不同的变量引用同一个对象。

换句话说,我假设你已经知道所有具有相同内容的 String 字面量都指向同一个对象,所以如果你声明了两者

public final String someString1 = "Hi";
public static final String someString2 = "Hi";

someString1someString2引用同一个对象。因此,如果变量的声明对对象产生了影响,那么这里应该与哪一个相关?

您甚至可以使用完全没有变量的相同对象,例如

System.out.println("Hi");

声明变量的原因要简单得多static。它始终具有相同的内容,因此没有理由为每个对象保留内存,只是为了始终从该常量读取相同的引用。事实上,由于这样的声明是编译时常量,它甚至不会在运行时被读取。

于 2018-08-02T15:07:53.947 回答