【问题标题】:A question about initializing a newly created empty string in Java [duplicate]关于在 Java 中初始化新创建的空字符串的问题 [重复]
【发布时间】:2021-08-04 03:31:22
【问题描述】:

我正在阅读OpenJDK中String.java的源码jdk16u。

它的一个构造函数如下所示:

    /**
     * Initializes a newly created {@code String} object so that it represents
     * an empty character sequence.  Note that use of this constructor is
     * unnecessary since Strings are immutable.
     */
    public String() {
        this.value = "".value;
        this.coder = "".coder;
    }

显然.value 指的是这个私有的byte 数组:

    /**
     * The value is used for character storage.
     *
     * @implNote This field is trusted by the VM, and is a subject to
     * constant folding if String instance is constant. Overwriting this
     * field after construction will cause problems.
     *
     * Additionally, it is marked with {@link Stable} to trust the contents
     * of the array. No other facility in JDK provides this functionality (yet).
     * {@link Stable} is safe here, because value is never null.
     */
    @Stable
    private final byte[] value;

这意味着当我们使用 String() 作为构造函数时,this.value 引用了"".value. 但是,我找不到"".value 的确切定义。在我看来,这像是一个循环定义。

编辑:这不是循环定义。我的意思是Java怎么知道“”表示空字符串。

【问题讨论】:

  • 使用"".value 只会导致字符串为空字符序列,而不是可能导致各种问题的未定义值。
  • "".value的定义是“空字符串的value字段”。这个循环怎么样?请注意,this 与 "" 不是同一个对象。
  • @sorfiend 到底在想什么问题?因为我觉得这个构造函数真的很蠢
  • 唯一的用例是当你想定义一个新的空字符串,而不是一个文字。当正是我无法理解时
  • @sorfiend 你的意思是说当计算机编译代码“”.value的时候,它会检测到“”是一个空字符串,所以它会创建一个空字符串对象,并将它的值初始化为一个char[ 0](新字符[]{})

标签: java string


【解决方案1】:

这是正在构造的对象。由文字“”表示的空字符串是一个已经存在的字符串对象,它与正在构造的对象是分开的。 value 是 String 上的私有字段。该代码将预先存在的空字符串值分配给新对象的值。这里没有循环。

一个对象可以看到另一个对象的私有成员有点奇怪,这在类定义中是允许的,只要另一个对象具有相同的类型。通常你会在 equals 方法中看到这一点。

String 的文字语法被编码到编译器中。不同的 JVM 语言允许不同类型的对象使用不同的文字语法,语法是语言的一部分。 Groovy、Clojure 和 Scala 对于各种事物都有非常不同的文字语法。 https://docs.oracle.com/javase/specs/jls/se16/html/jls-3.html#jls-3.10.5

中详细说明了文字规则

【讨论】:

  • 1+,已经构建是这里的关键。现在,为什么世界上需要这样的东西?你碰巧知道吗?
  • @Eugene:和你一样,我认为这没有意义。他们一定希望 String 有一个零参数的构造函数,但谁知道呢。
  • 那么实际上编译器可以检测到“”代表空字符串吗?那么对于空字符串,对应的构造函数是什么?使用公共字符串(字符值 [])?
  • @LeonloveKaren:我没有看到规范说明使用什么构造函数。它绝对不会使用无参数的。
  • 总结一下,我真正需要明确的是:对于空字符串“”,它的构造函数是什么。但是,我无法设置断点来查看这是如何发生的。
猜你喜欢
  • 2013-07-05
  • 2010-12-25
  • 1970-01-01
  • 2019-09-01
  • 2016-07-27
  • 2022-01-11
  • 1970-01-01
  • 2011-03-20
  • 1970-01-01
相关资源
最近更新 更多