我找不到这个问题,很抱歉我的搜索技能错过了!
在Java 8之前,我相信诸如之类的声明
...
public final String someString = "Hi";
public final int someInt = 17;
最好声明为:
...
public static final String someString = "Hi";
public static final int someInt = 17;
与后PermGen(现在的Metaspace(还有区别吗?-XX:+UseStringDeduplication
对这种差异有任何影响吗(无论如何对于字符串(?
包含对对象的引用的变量对被引用的对象没有影响。如果有,那就很奇怪了,因为可能有很多不同的变量引用了同一个对象。
换句话说,我假设,您已经知道所有具有相同内容的字符串文字都引用了相同的对象,所以如果您声明both,
public final String someString1 = "Hi";
public static final String someString2 = "Hi";
CCD_ 2和CCD_。那么,如果变量的声明对对象产生了影响,那么哪一个应该与此相关?
您甚至可以使用完全没有变量的同一对象,例如
System.out.println("Hi");
声明变量static
的原因要简单得多。它总是有相同的内容,所以没有理由为每个对象保留内存,只是为了总是从该常量中读取相同的引用。事实上,由于这样的声明是一个编译时常量,因此在运行时甚至不会读取它。