当前位置: 首页 > 面试题库 >

Java中的字符串初始化

钱黎明
2023-03-14
问题内容
  1. String str1;
  2. String str2 = null;
  3. String str3 = "";
  4. String str4 = new String();
  5. String str5 = new String("");

我知道对于上面的第3个初始化,字符串对象在字符串池中初始化,而第4个与字符串池无关。

1.和2有 什么区别?如果我将其str1视为指针变量,它存储的是特定内存地址,而该内存地址从未被JVM或OS使用?

4.和5 之间有区别吗?

当我打印str1str2通过直接System.out.println(str1)System.out.println(str2),对str1,我甚至无法通过compilation.For
str2,编译OK,我得到“空”,并在控制台窗口中的输出。为什么?

@aioobe的答案后编辑:更多问题:

我想了解更多有关“
null”的信息。由于str2(参考变量)就像一个指针变量,因此其中(在该指针变量所占用的内存中)应该有一些内容(0/1位)。由于将其初始化为null,是全0位还是null的字节码全为零?另一个问题是,如果我调用toString()方法上str2str2.toString(),我得到了在运行时一个空指针错误。因此,由JVM检查引用变量是否为null?JVM如何知道它为null?JVM检查中的位str2

关于Java中 null的 另一个问题:
null和字符串文字的串联


问题答案:

1.和2.有什么区别?如果我将其str1视为指针变量,它存储的是特定内存地址,而该内存地址从未被JVM或OS使用?

如果这些是 中的 字段 ,则没有区别,因为引用类型的字段(例如String)的默认值已经是null

如果这些是 局部变量
(即在方法中声明的变量)str1将不会初始化为任何内容,而str2将初始化为null。此处的区别在于,局部变量在初始化之前无法使用,因此(如您所发现的)您不能打印str1,但可以打印str2

4.和5.之间有区别吗?

不,不是语义上的。但是,您将获得略有不同的字节码。

当我直接通过System.out.println(str1)和System.out.println(str2)打印str1和str2时,对于str1,我什至无法通过编译。对于str2,编译正常,并且在控制台窗口中得到“
null”和输出。为什么?

这似乎表明这些是局部变量。使用局部变量之前,需要对其进行初始化。

我想了解更多有关“
null”的信息。由于str2(参考变量)就像一个指针变量,因此其中(在该指针变量所占用的内存中)应该有一些内容(0/1位)。当它初始化为时null,它是全0位还是null全零?

另一个问题是,如果我调用该方法toString()str2str2.toString(),我得到了在运行时一个空指针错误。因此,由JVM检查引用变量是否为null

是。

JVM如何知道它是null?JVM检查中的位str2

是。



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

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

  • 问题内容: 如果String和其他字符串一样是一个类,如何使用双引号将其初始化? 问题答案: Java的设计者决定保留面向对象语言中的原始类型,而不是将所有内容都变成对象,以提高语言的性能。原语存储在调用堆栈中,这需要较少的存储空间,并且操作成本较低。另一方面,对象存储在程序堆中,这需要复杂的内存管理和更多的存储空间。 出于性能原因,Java的String设计为介于基本体和类之间。 例如 注意:

  • 同一类型的扫描仪方法在一个地方工作,但在另一个地方不工作。。。如果这改变了任何答案,我将使用eclipse作为我的代码编辑器。如果不是在这里,所有变量都已在别处声明。 如果有人知道如何解决这个问题,我将永远感激你:) 这一个正在工作: 这个不起作用: 错误消息:

  • 问题内容: 考虑一个名为的Java字符串字段。为类x创建对象时的初始值是多少? 我知道对于变量,在创建实例时将默认值分配为。但是会变成什么呢? 问题答案: 如果不执行任何操作,则将其初始化为null,所有引用类型也将初始化为null。

  • 问题内容: Go Newbie问题:我正在尝试使用默认值初始化以下结构。我知道,如果“ Uri”是字符串而不是指向字符串(* string)的指针,则可以使用。但是我需要这个指针来比较结构的两个实例,如果未设置Uri,则Uri将为nil,例如,当我从json文件解组内容时。但是,如何正确地将这样的结构初始化为“静态默认值”呢? 上面的代码因 问题答案: 无法获得(指向)常数值的地址,这就是初始化失