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

Java中“ new String(…)”表达式的目的是什么?

荣波
2023-03-14
问题内容

在查看在线代码示例时,有时会遇到通过使用new运算符将String常量分配给String对象的情况。

例如:

String s;
...
s = new String("Hello World");

当然,与

s = "Hello World";

我不熟悉这种语法,也不知道其目的或效果。由于String常量通常存储在常量池中,然后JVM以任何表示形式存储在处理String常量中,因此是否还会在堆上分配任何内容?


问题答案:

你可能需要的一个地方new String(String)是强制子字符串复制到新的基础字符数组,如

small=new String(huge.substring(10,20))

但是,不幸的是,此行为是未记录的,并且取决于实现。

当将大文件(最多20 MiB)读入字符串并在事后将其刻成几行时,我对此感到非常恼火。我最后得到了引用由整个文件组成的char []的所有字符串。不幸的是,与处理文件相比,我无意间对整个数组的引用保留了更长的时间,这比处理文件要更长的时间-我被迫用来new String()解决该问题。

唯一与实现无关的方法是:

small=new String(huge.substring(10,20).toCharArray());

不幸的是,这必须将数组复制两次,toCharArray()一次在String构造函数中一次。

需要有一种通过复制现有字符串的字符来获取新String的文档化方法;或String(String)需要改进的文档以使其更明确(此处有隐含含义,但相当含糊且易于解释)。

假设文档没有陈述的陷阱
为了回应不断出现的评论,请观察Apache Harmony的实现new String()是:

public String(String string) {
    value = string.value;
    offset = string.offset;
    count = string.count;
}

没错,那里没有底层数组的副本。但是,它仍然符合(Java 7)字符串文档,因为它:

初始化一个新创建的String对象,使其表示与参数相同的字符序列;换句话说,新创建的字符串是参数字符串的副本。除非需要显式的原始副本,否则不需要使用此构造函数,因为字符串是不可变的。

突出的部分是“参数字符串的副本”;它不会说“参数字符串和支持该字符串的基础字符数组的副本”。

请注意,你应按照文档而不是一种 实现编程。



 类似资料:
  • 问题内容: Java表达式中的双引号是什么意思? 我有: 有人可以解释这些表达式的计算方式,最后一个的目的是什么? 问题答案: 里面的任何东西都会变成。和+ =。例如 你会得到 在你的问题上 将被评估为:

  • 在Java中lambda表达式是怎样的对象?作为函数式编程的一部分,lambda表达式如何在Java中实现,而Java是一种面向对象的语言?我需要哪些Java概念来理解lambda表达式?

  • 问题内容: 我偶然发现了以下Java代码,该代码使用了方法参考 等价的lambda表达式是什么? 问题答案: 方法参考将首先求值,然后创建一个等效的表达式来捕获求值。通常,你将使用 与方法引用相同的方法来实现,但是此lambda表达式将在每次调用该方法时求值。 因此,确切的等效条件是: 如果有人;在两者之间进行调用,则会有所不同。

  • 由两位数字后跟三个大写字母表示的产品代码。 在一行开头找到从100欧元到999欧元的所有欧元值。

  • 问题内容: 我知道yield将函数转换为生成器,但是yield表达式本身的返回值是多少?例如: 该函数执行时变量的值是什么? 我已经阅读了Python文档:http : //docs.python.org/reference/simple_stmts.html#grammar- token-yield_stmt, 并且似乎没有提及yield表达式本身的值。 问题答案: 您还可以将值赋给生成器。如果

  • 问题内容: 有没有办法让AngularJS在模型数据中评估表达式? HTML: 模型: 最终结果将是:。 问题答案: 您可以使用该服务来插值字符串… JSFiddle