Java 中的连接字符串是否总是会导致在内存中创建新字符串?

2023-12-28

我有一条很长的字符串,不适合屏幕的宽度。例如。

String longString = "This string is very long. It does not fit the width of the screen. So you have to scroll horizontally to read the whole string. This is very inconvenient indeed.";

为了方便阅读,我想这样写——

String longString = "This string is very long." + 
                    "It does not fit the width of the screen." +
                    "So you have to scroll horizontally" +
                    "to read the whole string." +
                    "This is very inconvenient indeed.";

然而,我意识到第二种方法使用字符串连接,并且会在内存中创建 5 个新字符串,这可能会导致性能下降。是这样吗?或者编译器是否足够聪明,能够弄清楚我所需要的实际上只是一个字符串?我怎样才能避免这样做呢?


我意识到第二种方法使用字符串连接,并将在内存中创建 5 个新字符串,这可能会导致性能下降。

不,不会。由于这些是字符串文字,因此将在编译时对它们进行求值,并且只有一根弦将被创建。这是定义在Java 语言规范 #3.10.5 http://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.10.5:

长字符串文字始终可以分解为较短的片段,并使用字符串连接运算符 + 编写为(可能带括号的)表达式
[...]
此外,字符串文字始终引用 String 类的同一个实例。

  • 由常量表达式(第 15.28 节)计算的字符串在编译时计算,然后将其视为文字。
  • 在运行时通过连接计算的字符串是新创建的,因此是不同的。

Test:

public static void main(String[] args) throws Exception {
    String longString = "This string is very long.";
    String other = "This string" + " is " + "very long.";

    System.out.println(longString == other); //prints true
}

然而,下面的情况有所不同,因为它使用了一个变量 - 现在有一个串联并创建了多个字符串:

public static void main(String[] args) throws Exception {
    String longString = "This string is very long.";
    String is = " is ";
    String other = "This string" + is + "very long.";

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

Java 中的连接字符串是否总是会导致在内存中创建新字符串? 的相关文章

随机推荐

  • 重命名目录中列表中的单个文件

    请原谅我的编程无知 这就是你们天才存在的原因 我想通过计划任务每 30 分钟重命名一个文件 文件列表 测试1 txt 测试2 txt 测试3 txt 等等 进入 测试 txt 测试2 txt 文本3 txt 等等 test txt 将被程序
  • 乌克兰语字母的正则表达式。如何用大写字母分隔西里尔字母?

    我有一个字符串 里面有一些西里尔字母 每个都以大写字母开头 var str 我找到了这个解决方案str match g 但它让我回归 代替 似乎它不能识别乌克兰字母 只能识别俄语 那么 我该如何更改该正则表达式以包含乌克兰字母 不是西里尔字
  • 如果列内的值非空,则在 pandas 中创建一个新的派生列

    我的输入数据是这样的 SL NO Name 1 KING BATA 2 3 4 AGS 5 FORMULA GROWTH 6 7 Bag Output SL NO Name Value 1 KING BATA Present 2 Not P
  • 数组或切片的多重赋值

    在 Go 中是否可以将数组解包为多个变量 就像在 Python 中一样 例如 var arr 4 string 4 string X Y Z W x y z w arr 我发现 Go 不支持这个 我可以做些什么来避免写作x y z w ar
  • 如何在 Linux 上的 java 应用程序中使用数字键盘箭头

    数字键盘上的箭头键不适用于 Linux 上的 Java 应用程序 奇怪的是 Home End PgUp PgDn Ins Del 都可以工作 当使用 Intellij 进行编程时 这一点尤其令人烦恼 如何让箭头键发挥作用 IntelliJ
  • ReactJS 应用程序的集成/验收测试

    我已阅读有关 Jest 的文档 然而 这似乎意味着对各个组件进行单元测试 如何测试组件的集成 或者验收测试使用 React JS 使用 Flux 编写的 Web 应用程序的一项功能 例如 测试电子商务 React 应用程序中的结账流程 用户
  • 如何使用带有 groovy 闭包的构造函数参数实例化 Java 抽象类

    我正在尝试从我的 Groovy 代码实例化一个 Java 抽象类 考虑以下 Java 抽象类 从类中剥离非相关处理 public abstract class StackOverflow public abstract String ans
  • 存储调查数据的最佳方式?

    我正在开发一个非常小的调查应用程序 可能有 3 4 页的 Web 应用程序 所以我的问题是保存调查数据的最佳方法是什么 顺便说一句 到目前为止我已经想出了以下方法 保存到数据库并将每个调查标记为不完整 当用户提交最后一份调查表格时 检查调查
  • 收集信用卡信息 - 并非收取付款

    我正在 Linux 服务器上使用 PHP 和 MySQL 进行工作 我有一个要求 我试图说服他们 从用户那里收集信用卡信息 以便我们公司可以使用卡号来保留酒店房间参加会议 我们根本不会自己给卡充值 而是将其发送到酒店 然后 我需要能够下载
  • 参数的默认值在 SSRS 2008 R2 中不起作用

    我有一个报告 BIDS SSRS 2008 R2 其中有一个参数 允许用户从列表 比如说销售区域 中选择多个值 不过 由于列表很长 大约有 15 个可能的值 我希望默认选择最常用的 2 个值 我在 参数属性 gt gt 默认值 对话框中进行
  • C# 通过句柄 (hWnd) 32 和 64 位获取路径/文件名

    我得到以下代码来通过句柄获取路径 文件名 DllImport user32 dll CharSet CharSet Auto SetLastError true private static extern int GetWindowThre
  • 用于具有 REST API 身份验证的 WebRTC 的 TURN 服务器

    我正在尝试为 webRTC 设置 rfc5766 turn server TURN 服务器here https code google com p rfc5766 turn server 我能够使用 TURN 服务器成功转发我的视频turn
  • Django 验证 ImageField 尺寸等

    我有一个自定义的清洁方法如下 def clean image self image self cleaned data image if image from django core files images import get imag
  • 没有找到现成的 kinect?

    我是 Kinect 编程的初学者 我已经安装了windows sdk 我尝试在开发人员中运行示例 然而 它说 没有找到准备好的kinect 我知道知道为什么 有人能帮我解决这个问题吗 多谢 Yuanhui 我也是初学者 其实我昨天刚拿到ki
  • ServiceStack“新”api 和异步等待

    服务堆栈版本 3 我很熟悉https github com ServiceStack ServiceStack wiki New API https github com ServiceStack ServiceStack wiki New
  • jsPlumb:拖动新连接应删除现有连接

    使用 jsPlumb 我设法进行了以下设置 有多个节点 其作用类似于特殊类型流程图中的节点 每个节点都有一个可以将连接丢弃到的目标 每个节点都有零个 一个或多个出口 每个出口作为jsPlumb源 最多允许有1个连接 先举个小例子 http
  • Internet Explorer innerHTML 输出不带引号的属性

    我正在使用 IE 8 并尝试设置元素 Id 属性 然后我将该元素附加到父元素并检查它的innerHTML 我看到的问题是 id 属性缺少双引号 起初我认为这可能是因为我使用了 setAttribute 属性 而这在 IE 8 中可能有问题
  • Git Pull:更改身份验证

    我对 git 很陌生 我在服务器 A 上设置了一个存储库 其中通过 ssh rsa 密钥进行访问 我在那里有一些用户 包括我自己 现在我做git clone在我的本地计算机上获取本地副本 进行更改 然后push origin master
  • html 在所有设备上保持相同的字符大小

    我用几个输入按钮做了一个关于 html 的练习 http bullmalay appspot com http bullmalay appspot com 我在手机上访问它 但我发现文字尺寸真的很小 我认为原因在于分辨率 谁能帮我调整一下文
  • Java 中的连接字符串是否总是会导致在内存中创建新字符串?

    我有一条很长的字符串 不适合屏幕的宽度 例如 String longString This string is very long It does not fit the width of the screen So you have to