当前位置: 首页 > 知识库问答 >
问题:

关于在Java[重复]中初始化新创建的空字符串的问题

东方新霁
2023-03-14

我正在阅读<code>String的源代码。OpenJDK jdk16u中的java。

其中一个构造函数如下所示:

    /**
     * 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是指这个私有< code >字节数组:

    /**
     * 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怎么知道""是空字符串的意思。

共有1个答案

胡景澄
2023-03-14

这是正在构建的对象。由文本“”表示的空字符串是一个已经存在的字符串对象,它独立于正在构造的对象。值是字符串上的私有字段。代码将预先存在的空字符串值赋给新对象的值。这里没有循环。

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

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

 类似资料:
  • 问题内容: 我知道对于上面的第3个初始化,字符串对象在字符串池中初始化,而第4个与字符串池无关。 1.和2有 什么区别?如果我将其视为指针变量,它存储的是特定内存地址,而该内存地址从未被JVM或OS使用? 4.和5 之间有区别吗? 当我打印和通过直接和,对,我甚至无法通过compilation.For ,编译OK,我得到“空”,并在控制台窗口中的输出。为什么? @aioobe的答案后编辑:更多问题

  • 在我的应用程序中,一切正常,但我想提高性能并优化我的代码。 这两个哪个更适合 1.initialisation 2.连接

  • 问题内容: 显然,javac中初始化字符串的大小受到限制。谁能帮助我确定最大限额? 谢谢 编辑: 我们正在构建一个初始化字符串,看起来像这样的“ {1,2,3,4,5,6,7,8 ......}”,但理想情况下应包含10,000个数字。当我们为1000执行此操作时,10,000会引发错误,提示代码对于try语句而言太大。 为了产生这种效果,我们使用了一个stringbuilder并在附加值的数组上

  • 我注意到,当我创建任何特定类型对象的数组列表时,我需要像这样初始化它: 我对此进行了研究,我唯一发现的是包括第二个对象的初始化。我想知道这种结构的‘为什么’。 我知道(现在)这个问题有一个明确的答案(我发现Java7中菱形运算符的意义是什么?在这里),但我离开了这个问题,因为如果不知道术语“菱形运算符”,研究非常困难。

  • 我是堆栈溢出的新手,我发现它非常有用,非常感谢一个伟大的社区。虽然我一直在了解 java 中的字符串,但我只是想知道字符串文字源代码是如何创建的?我理解了java中字符串的大部分概念。这是一种特殊的最终类,我也理解在创建 String 文字时,将在堆上创建一个对象,其引用将在字符串常量池中。通过使用这个。 我还了解到,当使用 new 运算符创建字符串时,引用将在堆上具有对象,并在字符串常量池中具有

  • 本文向大家介绍关于Java数组声明、创建、初始化的相关介绍,包括了关于Java数组声明、创建、初始化的相关介绍的使用技巧和注意事项,需要的朋友参考一下 本文讲述了Java数组的几个相关的方面,讲述了对Java数组的声明、创建和初始化,并给出其对应的代码。 一维数组的声明方式:type var[]; 或type[] var; 声明数组时不能指定其长度(数组中元素的个数), Java中使用关键字new