草庐IT

java - "new String()"也是不可变的吗?

coder 2023-04-28 原文

我研究 Java 字符串已经有一段时间了。以下问题基于以下帖子

Java String is special
Immutability of String in java

  1. 不变性: 现在,通过不变性,String 类的设计使得 common pool 中的值可以在其他地方/变量中重用。如果 String 被创建为

    String a = "Hello World!"; 但是,如果我创建像

    这样的字符串

    String b = new String("Hello World!"); 为什么这也是不可变的? (或者是吗?)。由于它有一个专用的堆内存,我应该能够在不影响任何其他变量的情况下修改它。那么按照设计,是否有任何其他原因将 String 作为一个整体视为不可变的?还是我上面的假设是错误的?

  2. 我想问的第二件事是关于通用字符串池。如果我将字符串对象创建为

    String c = ""; 池中是否创建了一个空条目?

有没有关于这些的帖子?如果是这样,有人可以分享链接吗?

最佳答案

new String() 是一个产生 String ... 的表达式,而 String 是不可变的,无论它是如何产生的.

(询问 new String() 是否可变是荒谬的。它是程序代码,而不是值。但我认为这不是你真正的意思。)


If I create a string object as String c = ""; is an empty entry created in the pool?

是的;也就是说,为空字符串创建一个条目。空 String 没有什么特别之处。

(为了迂腐,"" 的池条目在您的代码执行之前很久就创建了。事实上,它是在您的代码加载时创建的......甚至可能比这更早。)


So, I was wanted to know whether the new heap object is immutable as well, ...

是的。但不变性是 String 对象的基本属性。所有 String 对象。

您看,String API 根本不提供 any 方法来更改 String。所以(除了一些使用反射的危险和愚蠢的1技巧),你不能改变一个String

and if so what was the purpose?.

Java String 被设计为不可变类的主要原因是简单。如果核心字符串类提供不可变接口(interface),则可以更轻松地编写正确的程序,并阅读/推理其他人的代码。

第二个重要的原因是 String 的不变性对 Java 安全模型具有根本意义。但我不认为这是原始语言设计中的驱动程序......在 Java 1.0 和更早版本中。

Going by the answer, I gather that other references to the same variable is one of the reasons. Please let me know if I am right in understanding this.

没有。它比这更根本。简单地说,所有 String 对象都是不可变的。理解这一点不需要复杂的特殊情况推理。它只是>>是<>

作为记录,如果您想要在 Java 中使用可变的“类似字符串”的对象,您可以使用 StringBuilderStringBuffer。但这些是与 String 不同的类型。


1 - 这些技巧 (IMO) 危险和愚蠢的原因是它们会影响应用程序的其他部分可能通过字符串池共享的字符串值。这可能会导致困惑......以致下一个维护您的代码的人几乎没有机会追踪到。

关于java - "new String()"也是不可变的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21375659/

有关java - "new String()"也是不可变的吗?的更多相关文章

  1. ruby-on-rails - rails : "missing partial" when calling 'render' in RSpec test - 2

    我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou

  2. ruby-on-rails - 由于 "wkhtmltopdf",PDFKIT 显然无法正常工作 - 2

    我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-

  3. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

    为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

  4. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  5. ruby-on-rails - 迷你测试错误 : "NameError: uninitialized constant" - 2

    我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test

  6. ruby-on-rails - 相关表上的范围为 "WHERE ... LIKE" - 2

    我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que

  7. 使用 ACL 调用 upload_file 时出现 Ruby S3 "Access Denied"错误 - 2

    我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file

  8. ruby - 安装 Ruby 时遇到问题(无法下载资源 "readline--patch") - 2

    当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub

  9. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  10. ruby - RVM "ERROR: Unable to checkout branch ."单用户 - 2

    我在新的Debian6VirtualBoxVM上安装RVM时遇到问题。我已经安装了所有需要的包并使用下载了安装脚本(curl-shttps://rvm.beginrescueend.com/install/rvm)>rvm,但以单个用户身份运行时bashrvm我收到以下错误消息:ERROR:Unabletocheckoutbranch.安装在这里停止,并且(据我所知)没有安装RVM的任何文件。如果我以root身份运行脚本(对于多用户安装),我会收到另一条消息:Successfullycheckedoutbranch''安装程序继续并指示成功,但未添加.rvm目录,甚至在修改我的.bas

随机推荐