Java 中表达式“new String(...)”的用途是什么?

2023-12-05

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

例如:

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

当然,这与

s = "Hello World";

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


您可能会遇到的唯一一个地方think你要new String(String)是强制内部字符数组的不同副本,如

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

然而,不幸的是,这种行为没有记录并且依赖于实现。

当我将大文件(有些高达 20 MiB)读取到字符串中并在事后将其雕刻成行时,我已经被这个问题困扰了。我最终得到了引用 char[] 的行的所有字符串,该行由整个文件组成。不幸的是,无意中保留了对整个数组的引用,因为我保留的几行时间比处理文件的时间更长 - 我被迫使用new String()解决这个问题,因为处理 20,000 个文件很快就会消耗大量 RAM。

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

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

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

需要有一种记录在案的方法,通过复制现有字符串的字符来获取新字符串;或文档String(String)需要改进以使其更加明确(那里有一个暗示,但它相当模糊且易于解释)。

假设文档没有说明的陷阱

为了回应不断出现的评论,请观察 Apache Harmony 的实现new String() was:

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

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

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

显着的部分是“论证的副本string”;它没有说“参数字符串的副本和支持该字符串的底层字符数组”。

请小心您的编程文档并不是one 执行.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 中表达式“new String(...)”的用途是什么? 的相关文章

随机推荐

  • 睡眠而不中断程序

    我正在创建一个程序 该程序在一段时间后倒计时 并要求输入秒数以添加到倒计时中 不是真的 只是一个例子 有点像这样 mytime 10 while True print time mytime 1 time sleep 1 mytime in
  • 在Java中,当我调用OutputStream.close()时,我是否总是需要先调用OutputStream.flush()?

    如果我只是打电话close 在输出流中 输出是有保证的 或者需要我调用flush always Whilst close应该打电话flush 比这更复杂一点 首先是装饰器 比如BufferedOutputStream 在 Java 中很常见
  • 向 Google Cloud ML 提交训练作业

    我有一个代码如下 我想将其提交给 Google cloud ml 我已经测试了他们的示例并得到了结果 from future import absolute import from future import division from f
  • informix jdbc 连接卡住

    我正在尝试使用标准方式使用 jdbc 连接到 Informix 数据库服务器 connection DriverManager getConnection jdbc informix sqli ip sid INFORMIXSERVER s
  • LARGE_INTEGER 和 DUMMYSTRUCTNAME

    当我遇到 LARGE INTEGER 的定义时 我发现一些问题 typedef union LARGE INTEGER struct DWORD LowPart LONG HighPart DUMMYSTRUCTNAME struct DW
  • 在VB.NET中编写洗牌方法

    我有一副标准的 52 张牌 以数组形式表示 每张卡都表示为一个整数 我编写了下面的函数来洗牌 下面的代码看起来没问题吗 Module Module3 Sub Main initialize array Dim Cards 52 As Int
  • 如何使 LINQ 执行 (SQL) LIKE 范围搜索

    我非常需要帮助 我已经尝试这样做有一段时间了 所以我有这个查询 Select name from BlaBlaBla order by case when name like 9 then 1 end case when name like
  • Elasticbeanstalk 在单个 Python 实例上配置 HTTPS:模板中不允许使用 null 值

    我已经在 EB 单实例 环境中部署了一个 Flask 应用程序 并且运行良好 现在我尝试使用自签名证书将其配置为 https 来测试它 因此 我添加了一个配置文件 如 EB 开发人员指南中所示的 ebextensions 其中我有 2 个以
  • 使用 LWUIT 列出带有复选框的列表

    我正在使用 LWUIT 来获取搜索工具以在List 现在我想知道如何显示列表CheckBoxes list new List vector cform addComponent list cform addComponent t cform
  • 如何在HandlerInterceptor中读取请求体?

    我有 Spring Boot 我需要在数据库中记录用户操作 所以我编写了 HandlerInterceptor Component public class LogInterceptor implements HandlerIntercep
  • WPF:调度程序处理挂起错误,没有有用的堆栈跟踪

    我有一个已经运行了 10 多年的 WPF 应用程序 最近 我们在某些计算机上的一些部署启动时开始出现以下异常 主应用程序窗口将加载 并且可以加载一些数据 但随后会出现许多错误 System InvalidOperationException
  • Android:GPS 从精细到粗略的回退

    问候 有谁知道当我没有修复时如何获得粗略的 GPS 坐标 以及当我有修复时如何获得精细的 GPS 坐标 我尝试在谷歌上搜索一些示例代码 但没有成功 我确实找到了这个 http www android10 org index php arti
  • Gmail 应用程序脚本 API 中是否会添加一个函数来获取分配给邮件的星标类型?

    Gmail 设置允许设置不同类型的星标several 黄星 红星 绿勾 Gmail中可以设置可以使用的星号类型数量设置菜单 谷歌应用脚 本 s Gmail 服务包括一个Gmail消息 已加星标它只返回一个布尔值 它不提供所设置的星星的类型
  • python 中的 int('123') - 它是'int'类的函数调用还是构造函数调用?

    我正在学习Python 对Python的数据类型有点困惑 我一遍又一遍地读这句话 Python 中一切都是对象 这包括整数 浮点数 字符串 集合 列表等 当我们这样写时 1 2 3 所以我们实际上创建了一个对象list类 或不类 所以 当我
  • Ubuntu 远程连接 Mysql - 绑定地址失败

    我正在尝试配置我的服务器以允许远程连接 据我了解 我需要取消注释bind address 127 0 0 1 in the my cnf file 然后重新启动mysql 那没有用 我也尝试过将其更改为bind address 0 0 0
  • WordPress 中单个自定义帖子类型的多个 URL

    我有一个房地产代理房地产网站 其自定义帖子类型为 property 因此当前的 URL 结构是 property the address here 现在 在每处房产上 您都可以选择该房产是出售还是出租 我现在想保留单个自定义帖子类型 但单个
  • C# 中的按键事件——移动 PictureBox

    我试图通过按键事件上下移动 PictureBox picUser 我是 C 新手 可以通过 VB 来完成此操作 因此 我对以下代码的问题所在感到困惑 private void picUser keyDown object sender Sy
  • forkjoin 没有返回结果

    我正在使用 forkJoin 合并两个 firebase 请求的结果 两个请求均完成并记录在控制台中 但 forkJoin 本身的映射函数不会触发 因此不会向应用程序返回任何结果 public initGroup groupname use
  • 如何将选择选项值和文本存储在 JSON 对象或数组中?

    我有一个选择列表 示例如下 我想将此选择列表 文本和值 存储在 JSON 对象或数组对象中 这样我以后就可以使用 each 函数来完成它 然后我想根据用户输入显示 隐藏选择选项列表中的记录 所有代码都已准备就绪并可以工作 只是我无法弄清楚如
  • Java 中表达式“new String(...)”的用途是什么?

    在查看在线代码示例时 我有时会遇到通过使用 new 运算符将 String 常量分配给 String 对象的情况 例如 String s s new String Hello World 当然 这与 s Hello World 我不熟悉这种