Java-奇怪的静态字符串行为-新的String(“ xxx”)与“ xxx”

drag0nius;
public class Test {

    private static final String str1 = new String("en");
    private static Test instance = initInstance();

    private static final String str2 = new String("en");
    private static final String str3 = "en";

    private Test() {
    }

    public static void main(String[] args) {
    }

    private static Test initInstance() {
        instance = new Test();
        System.out.println(str1 + ',' + str2 + ',' + str3);
        return instance;
    }
}

从理论上讲,到处都有静力学,它会导致“ en,en,en”。

结果:“ en,null,en”

预期:“ en,null,null”(因为我发现静态顺序实际上很重要)

有人可以解释一下吗?“ en”和新的String(“ en”)有何不同?

博zh:

是。在您调用该方法时,str2尚未初始化(字段按声明顺序初始化),而str3是编译时常量。

编译时常量在类文件中由编译器内联。new String(“ ..”)不是常量,因为它使用构造函数。

字符串常量由字符串文字“”定义,并将它们放置在jvm实例的字符串池中,以便重复使用。与此相反,使用new String(..)创建一个新实例,因此应避免使用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

异常在线程“主” java.lang.IllegalArgumentException异常:安装方案“HTTP” URI的“http://xxx.xxx.xxx.xxx:xxxx”没有NetworkModule

java.lang.NoClassDefFoundError:无法初始化类XXX

Java SE标准类无法解析导入XXX

网络安全策略不允许与XXX.XXX.XXX.XXX进行CLEARTEXT通信

Spark 2.2非法模式组件:XXX java.lang.IllegalArgumentException:非法模式组件:XXX

java.lang.NoClassDefFoundError:无法初始化类xxx.xxx.xxx.HibernateUtil

拨打tcp:查找xxx.xxx.xxx.xxx:没有这样的主机

(GETENV XXX)不是Lisp字符串或指针

找不到模块xxx,xxx要求

按XXX排序按钮

grep表示类似xxx12345的字符串

u'string'是否与'string'.decode('XXX')相同

在Java中,如何将数字格式化为字符串,使其格式为“ xxx.xxx.xxx,yy”?

正则表达式匹配字符串'xxx(yyy)(zzz(qqqq))'或'xxx(yyy)'

资源“ xxx”无法解析

C ++中的XXX注释

Java错误:XXX类型中的XXX方法不适用于自变量

“ route add -host xxx.xxx.xxx.xxx dev eth0:1”的含义

输出端口上的XXX

C#字符串unescape'&#xxx;'

R:分割格式为“ xxx; yyy; zzz;”的字符串

R:分割格式为“ xxx; yyy; zzz;”的字符串

比较两个版本字符串(4.xxx,5.xxx)

find -perm -xxx中连字符的含义

错误:“ xxx”不是类型

无法使用“创建新 XXX”

我想用空格 XX XXX XXX 分隔字符串

从字符串 ZXXXXXXXXX 中查找电话号码 +Z XXX-XXX-XXX

以“=xxx+xxx...”的形式生成总和