Java中String(String)构造函数的使用[重复]

2024-04-09

我读过的文章和书籍使用String s = new String("...");应该一直避免。我明白为什么会这样,但是使用 String(String) 构造函数有什么用处吗?我认为不存在,也没有看到任何其他证据,但我想知道 SO 社区中是否有人知道其用途。


这是一篇好文章:被认为无用的字符串构造函数最终证明是有用的! http://kjetilod.blogspot.com/2008/09/string-constructor-considered-useless.html

事实证明,这个构造函数实际上至少在一种情况下是有用的。如果您曾经查看过 String 源代码,您会发现它不仅具有用于 char 数组值和字符计数的字段,还具有用于到 String 开头的偏移量的字段。这样字符串就可以与其他字符串共享 char 数组值,这通常是调用 substring() 方法之一的结果。多年前,Java 在 jwz 的 Java 咆哮中就因此受到了著名的谴责:

造成这种开销的唯一原因是 String.substring() 可以返回共享相同值数组的字符串。这样做的代价是向每个 String 对象添加 8 个字节,这并不是净节省......

除了节省字节之外,如果您有这样的代码:

// imagine a multi-megabyte string here  
String s = "0123456789012345678901234567890123456789";  
String s2 = s.substring(0, 1);  
s = null;

现在,您将拥有一个 String s2,尽管它看起来是一个单字符字符串,但它包含对在 String s 中创建的巨大 char 数组的引用。这意味着即使我们已经显式地将 String 清空,该数组也不会被垃圾收集!

解决这个问题的方法是使用我们之前提到的“无用”字符串构造函数,如下所示:

String s2 = new String(s.substring(0, 1));  

众所周知,如果旧数组大于字符串中的字符数,则此构造函数实际上会将旧内容复制到新数组。这意味着旧的 String 内容将按预期被垃圾收集。快乐快乐快乐快乐。

最后,凯特·马森 http://hanuska.blogspot.com/2006/03/how-useful-is-stringstring-constructor.html?showComment=1169976540000#c5481901777730175548提出这些观点,

首先,字符串常量永远不会被垃圾回收。其次,字符串常量是实习的,这意味着它们在整个虚拟机中共享。这样可以节省内存。但它并不总是如你所愿。

String 上的复制构造函数允许您从 String 文字创建私有 String 实例。这对于构造有意义的互斥对象(出于同步目的)非常有价值。

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

Java中String(String)构造函数的使用[重复] 的相关文章

  • Java JDBC:更改表

    我希望对此表进行以下修改 添加 状态列 varchar 20 日期列 时间戳 我不确定该怎么做 String createTable Create table aircraft aircraftNumber int airLineCompa
  • 给定两个 SSH2 密钥,我如何检查它们是否属于 Java 中的同一密钥对?

    我正在尝试找到一种方法来验证两个 SSH2 密钥 一个私有密钥和一个公共密钥 是否属于同一密钥对 我用过JSch http www jcraft com jsch 用于加载和解析私钥 更新 可以显示如何从私钥 SSH2 RSA 重新生成公钥
  • 使用 Android 发送 HTTP Post 请求

    我一直在尝试从 SO 和其他网站上的大量示例中学习 但我无法弄清楚为什么我编写的示例不起作用 我正在构建一个小型概念验证应用程序 它可以识别语音并将其 文本 作为 POST 请求发送到 node js 服务器 我已确认语音识别有效 并且服务
  • INSERT..RETURNING 在 JOOQ 中不起作用

    我有一个 MariaDB 数据库 我正在尝试在表中插入一行users 它有一个生成的id我想在插入后得到它 我见过this http www jooq org doc 3 8 manual sql building sql statemen
  • 将一串数据标记为结构向量?

    因此 我有以下数据字符串 该数据是通过 TCP winsock 连接接收的 并且想要进行高级标记化 将其转换为结构向量 其中每个结构代表一条记录 std string buf 44 william adama commander stuff
  • Android MediaExtractor seek() 对 MP3 音频文件的准确性

    我在使用 Android 时无法在eek 上获得合理的准确度MediaExtractor 对于某些文件 例如this one http www archive org download emma solo librivox emma 01
  • 多个 Maven 配置文件激活多个 Spring 配置文件

    我想在 Maven 中构建一个环境 在其中我想根据哪些 Maven 配置文件处于活动状态来累积激活多个 spring 配置文件 目前我的 pom xml 的相关部分如下所示
  • JavaMail 只获取新邮件

    我想知道是否有一种方法可以在javamail中只获取新消息 例如 在初始加载时 获取收件箱中的所有消息并存储它们 然后 每当应用程序再次加载时 仅获取新消息 而不是再次重新加载它们 javamail 可以做到这一点吗 它是如何工作的 一些背
  • Spring Data JPA 应用排序、分页以及 where 子句

    我目前正在使用 Spring JPA 并利用此处所述的排序和分页 如何通过Spring data JPA通过排序和可分页查询数据 https stackoverflow com questions 10527124 how to query
  • 磁模拟

    假设我在 n m 像素的 2D 表面上有 p 个节点 我希望这些节点相互吸引 使得它们相距越远吸引力就越强 但是 如果两个节点之间的距离 比如 d A B 小于某个阈值 比如 k 那么它们就会开始排斥 谁能让我开始编写一些关于如何随时间更新
  • 无法解析插件 Java Spring

    我正在使用 IntelliJ IDEA 并且我尝试通过 maven 安装依赖项 但它给了我这些错误 Cannot resolve plugin org apache maven plugins maven clean plugin 3 0
  • 如何为俚语和表情符号构建正则表达式 (regex)

    我需要构建一个正则表达式来匹配俚语 即 lol lmao imo 等 和表情符号 即 P 等 我按照以下示例进行操作http www coderanch com t 497238 java java Regular Expression D
  • Java按日期升序对列表对象进行排序[重复]

    这个问题在这里已经有答案了 我想按一个参数对对象列表进行排序 其日期格式为 YYYY MM DD HH mm 按升序排列 我找不到正确的解决方案 在 python 中使用 lambda 很容易对其进行排序 但在 Java 中我遇到了问题 f
  • 如何将 pfx 文件转换为 jks,然后通过使用 wsdl 生成的类来使用它来签署传出的肥皂请求

    我正在寻找一个代码示例 该示例演示如何使用 PFX 证书通过 SSL 访问安全 Web 服务 我有证书及其密码 我首先使用下面提到的命令创建一个 KeyStore 实例 keytool importkeystore destkeystore
  • getResourceAsStream() 可以找到 jar 文件之外的文件吗?

    我正在开发一个应用程序 该应用程序使用一个加载配置文件的库 InputStream in getClass getResourceAsStream resource 然后我的应用程序打包在一个 jar文件 如果resource是在里面 ja
  • Java Integer CompareTo() - 为什么使用比较与减法?

    我发现java lang Integer实施compareTo方法如下 public int compareTo Integer anotherInteger int thisVal this value int anotherVal an
  • Java执行器服务线程池[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如果我使用 Executor 框架在
  • Android 中麦克风的后台访问

    是否可以通过 Android 手机上的后台应用程序 服务 持续监控麦克风 我想做的一些想法 不断聆听背景中的声音信号 收到 有趣的 音频信号后 执行一些网络操作 如果前台应用程序需要的话 后台应用程序必须能够智能地放弃对麦克风的访问 除非可
  • simpleframework,将空元素反序列化为空字符串而不是 null

    我使用简单框架 http simple sourceforge net http simple sourceforge net 在一个项目中满足我的序列化 反序列化需求 但在处理空 空字符串值时它不能按预期工作 好吧 至少不是我所期望的 如
  • 节拍匹配算法

    我最近开始尝试创建一个移动应用程序 iOS Android 它将自动击败比赛 http en wikipedia org wiki Beatmatching http en wikipedia org wiki Beatmatching 两

随机推荐

  • 是否可以调试在 jni4net 中运行的 Java 程序?

    我目前正在使用 Java 库jni4net http jni4net com 在 IIS Express 上运行的 C 应用程序中 Java 库抛出异常 是否可以附加调试器来调试 Java 代码 Attempt 我尝试按照 提供的说明将以下
  • Ehcache避免将敏感数据存储到磁盘?

    我们希望使用 Ehcache 缓存不应该存储到磁盘的敏感数据 数据只能驻留在主内存中 这种数据存储在磁盘上是非法的 因此需要谨慎对待 我们已经在使用 Ehcache 无论是否带有陶土 来实现常见的缓存目的 我知道 Ehcache 提供了在主
  • Xcode 8 警告:“__textcoal_nt”部分已弃用

    我最近在 el cap 上更新到了 Xcode 8 今天早些时候我做了一个 xcode select install 还运行了brew来安装几个命令 我还更新了 Podfile 然后启动了 Xcode 8 直到现在我还没有为我正在处理的特定
  • 删除 Symfony2 表单中的表单命名空间(针对 REST API)

    我正在使用 Symfony2 设计 REST API 对于 POST 和 PUT 请求 我使用 FormType 就像是 class EmailType extends AbstractType public function buildF
  • SwiftUI 文本动画不透明度不起作用

    问题很简单 我到底如何才能获得Text正确设置动画 struct ContentView View State var foozle String var body some View VStack Spacer Text self foo
  • Java:加载重构后保存在硬盘上的对象=>“找不到类”异常:/

    我正在用java开发一个应用程序 它使用这个简单的方法定期将对象保存到硬盘上 public void save String filename try FileOutputStream fos new FileOutputStream fi
  • 在代码中重新加载反应本机应用程序

    我的用例是在单击按钮时重新加载应用程序 以便在单击后可以重新定义许多属性 有没有一种方法可以通过代码重新加载 React Native 应用程序 Thanks 这是一个巨大的解决方法 但它节省了大量时间 并避免了因摇晃不正确而带来的挫败感
  • 无法找到 WAMP 64 / Openssl Ordinal 372

    我正在尝试生成 SSL 证书 但我在这样做时遇到了这个错误 The 序数 372无法定位动态链接库 C wamp64 bin apache apache2 4 7 bin openssl exe 我已经搜索了一段时间 但解决方案不够详细 我
  • PKCS11异常:CKR_KEY_FUNCTION_NOT_PERMITTED

    你看 我有一个小程序 可以根据RSA在 pkcs11 令牌中找到的私钥 在巴西 现在有一些包含 2048 位私钥的新证书 也有常规 1024 位的旧型号 到目前为止 我的应用程序运行良好 我使用的是 1024 位证书 所以不用担心 但现在我
  • 使用 !== 或 != 将 Julia 变量与 `nothing` 进行比较

    在一些 Julia 代码中 何时可以看到条件表达式 例如 if val nothing dosomething end where val是一个类型变量Union Int Nothing 条件有什么区别val nothing and val
  • 返回布尔值和字符串值的最佳实践是什么

    我创建了一个方法 该方法对 XML 层次结构执行一些验证 该层次结构是在运行时由 Javascript 文本中的另一个类动态生成的 我的方法当前返回 True 或 False 这对使用我的类的任何人都有帮助 但我还想返回更多信息 因为可能有
  • CreateRemoteThread 返回 ERROR_ACCESS_DENIED - Windows 7 DLL 注入

    我正在尝试编写一个使用CreateRemoteThread注入一个dll 问题是 CreateRemoteThread 拒绝工作 GetLastError 返回 5 即 ERROR ACCESS DENIED 我不明白为什么 我正在根据这个
  • SNMP 错误,端口已在使用中

    我创建了一个 SNMP 代理模拟器应用程序 它对模拟设备使用端口号 161 有时会出现端口已使用异常 如何知道161端口是否繁忙 只需启动您的应用程序即可 如果它收到 BindException 则该端口正在使用中 如果没有 您的应用程序可
  • 如何在设定时间后关闭 ProgressDialog?

    我试图在 3 秒后自动关闭 ProgressDialog 框 这是对话框 ProgressDialog progress new ProgressDialog this progress setTitle Connecting progre
  • 如何在C#中通过解析Xml创建表达式树?

    我希望通过使用 C 解析 xml 来创建表达式树 xml 如下所示
  • 如何创建历史事实表?

    我的数据仓库中有一些实体 Person 具有 personId dateFrom dateTo 和其他可以更改的属性 例如姓氏 出生日期等 缓慢变化的维度 Document 文档 ID 编号 类型 Address 地址 ID 城市 街道 房
  • 阻止 Hibernate 创建非空约束

    有没有办法阻止 Hibernate 为带有注释的属性创建非空约束 javax validation constraints NotNull使用时hbm2ddl create 来自 Hibernate Validator 的文档 6 1 数据
  • 对包含空标记的字符串进行标记

    我有一个看似简单的问题 就是用逗号分隔String到令牌中 在以下情况下输出应包含空令牌 中的第一个字符String是一个逗号 中的最后一个字符String是一个逗号 出现两个连续的逗号 例如 对于String abd def ghi 应该
  • Java XMLGregorianCalendar 转换为 Java util.Date 时存在错误?

    我正在将日期 时间值写入 XML 文件 方法是从基于 RAP 的 UI 中读取日期作为 Java Date 对象 并将其作为XMLGregorianCalendar反对实际的文件编写代码 相应的类是自动生成的 我无法控制它们 我输入的日期是
  • Java中String(String)构造函数的使用[重复]

    这个问题在这里已经有答案了 我读过的文章和书籍使用String s new String 应该一直避免 我明白为什么会这样 但是使用 String String 构造函数有什么用处吗 我认为不存在 也没有看到任何其他证据 但我想知道 SO