对字符串使用静态变量

2023-12-03

以下内容摘自最佳实践:编写高效代码但我不明白为什么

private static String x = "example";

比...快

private static final String x ="example";

谁能解释一下这一点。

对字符串使用静态变量

当您定义静态字段时(也 称为字符串类型的类字段, 您可以通过以下方式提高应用程序速度 使用静态变量(非最终变量) 而不是常量(最终)。这 对于原始数据则相反 类型,例如 int。

例如,您可以创建一个字符串 对象如下:

private static final String x = "example";

对于这个静态常数(表示为 最终关键字),每次您 使用常量,一个临时字符串 实例已创建。编译器 消除“x”并将其替换为 字节码中的字符串“example”, 以便 BlackBerry® Java® Virtual 机器执行哈希表查找 每次您引用“x”时。

相反,对于静态变量(没有 Final 关键字),创建字符串 一次。 BlackBerry JVM 执行 仅当满足以下条件时才进行哈希表查找 初始化“x”,因此访问速度更快。

private static String x = "example";

您可以使用公共常量(即 最后字段),但您必须标记 变量为私有。


我不知道这一点,但这对我来说很有意义:

JVM 有一个内部字符串文字缓存。每次使用文字创建字符串时,JVM 都必须在缓存中查找它,如果不存在,则存储它。

现在,编译器可以使用字符串文字内联最终变量,因为它在编译时是已知的,并且对于性能来说这似乎是一个好主意。

所以你的代码:

static final String CONST = "myconst";
...
if (CONST.equals(aVar))
...
case CONST
...

被编译器重写为:

static final String CONST = "myconst";
...
if ("myconst".equals(aVar))
...
case "myconst"
...

如果 JVM 实现不够聪明,在本例中它需要查找“myconst”三次。

当您不将 CONST 标记为“final”时,编译器无法“优化”它,因为变量可以在运行时更改。您的代码将以 1:1 的方式进行编译,并且 JVM 只需要在变量处查找对象。

顺便说一句:糟糕的 JVM 实现不应该定义您的编码风格。 “final”提供了很大的安全性,因此只要它不会真正影响您的性能:不要关心它是否会提高或降低您的速度 - 无论如何,它对于下一个 JVM 来说是不同的

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

对字符串使用静态变量 的相关文章

随机推荐

  • 如何获取用户数据中的 AWS 实例标签?

    我将 aws ec2 userdata 与 windows powershell 脚本结合使用 我需要实例引导 我的想法是 EC2实例标签添加 它的键名称 Version 它的值 1 0 0 158 branchname 我尝试获取用户数据
  • 如何使用PHP和SQL Server 2008调用存储过程

    我正在使用 SQL Server 2008 和 PHP 我想在 PHP 中调用存储过程 请指导我 Regards read mssql execute conn mssql connect host user pass mssql sele
  • 是否可以在 C# 中使用 Microsoft 的脱机文件 API?

    我正在尝试弄清楚如何使用离线文件API来自 C 如果可能 我相信 如果 API 是 COM API 那么理论上我应该能够使用以下方法从 C 调用它here 不幸的是 我不知道它是否是 COM API 也不知道如何判断 作为一个更一般的旁注
  • 手动优化嵌套循环

    我正在做一项家庭作业 我必须手动优化嵌套循环 我的程序将在禁用优化的情况下编译 作业的目标是在 6 秒内运行整个程序 少于 4 5 秒的加分 我只允许更改一小块代码 起点是这样的 for j 0 j lt ARRAY SIZE j sum
  • Scala REPL“错误:值>不是类型参数T的成员”

    这是我的文件 trait Set T def contains x T Boolean def incl x T Set T def union that Set T Set T class Empty T extends Set T ov
  • 如何在Monodroid中使用dropnet、sharp box等库

    我已经在图像上传器上创建了一个桌面应用程序 现在我想使用 Monodroid 将其移植到 Android 应用程序将图像上传到保管箱 在桌面版本中 我使用了 dropnet 它引用了 sharpbox Json 等 有什么方法可以在我的 m
  • 如何让ANTLR消耗所有可见元素?

    这是我的语法 grammar test text foo EOF foo X foo foo foo tail tail foo 我正在解析这段文字 X X X X 这是我得到的树 语法应该改变什么才能让我只得到一个tail包含所有元素的集
  • C 使用 scanf() 进行 |分隔字符串

    我想输入一些字符串然后两个整数 字符串由 分隔 而整数则由 分隔 在网上浏览时我看到了某种语法 其中涉及 我正在使用这个 但它根本不起作用 有人可以指出我应该做什么以及为什么我所做的事情是错误的吗 sscanf str s s s i i
  • 将 SXSSF 保存为 .xls 文件

    我正在使用 Apache POI 库将大量数据导入 Excel 文件 我不能使用 HSSF 模型 因为它需要太多内存并且 Java 会抛出内存堆异常 我发现的方法是 SXSSF 工作簿模型 它将每 N 行写入文件 而不是将所有工作簿存储在内
  • oracle如何在没有UNION的情况下将列转置为行

    假设我的表中有 4 列 id col1 col2 col3 现在我想将其转置为一列但分为 4 行 result someid col1data col2data col3data 我怎样才能做到这一点 谢谢 这可以使用以下方法完成unpiv
  • Fortran 结构体指针

    我在将一个指向结构的指针分配给一个指向结构的指针时遇到问题 我使用 gfortran 4 6 3 文件名是 test pointer struct f08 因此我使用 Fortran 2008 标准 由 gfortran 4 6 3 支持
  • 多个主题的 firebase 消息传递条件不起作用

    我正在使用节点 firebase admin 向 Android 设备发送消息 所有作品 除非我尝试向多个主题发送消息 在下面的示例代码中 我只是订阅了 2 个主题 然后直接向某个条件下的多个主题发送通知 我的手机上什么也没有到达 当您只发
  • C++ Hello World 体系结构 x86_64 的未定义符号:

    应该很简单 但是当我编译 C Hello World 代码时返回一堆未定义的符号错误 my first program in C include
  • 在服务器端静默打印报表

    我正在尝试编写一个程序 允许我将 ssrs 报告 rdl 文件 从服务器端代码打印到预定打印机 而不会出现任何弹出窗口询问我要使用哪台打印机 这可以完成吗 EDIT还粘贴了代码ReportViewerDisposer我正在使用的实现 和班级
  • 无法访问 Facebook 会话 - UnknownError:无效的应用程序

    我正在使用 Unity3D 的 Prime31 SocialNetworking 插件和 Facebook SDK 3 5 并尝试在 Android 2 3 5 设备上登录 Facebook Facebook 应用程序安装在我的设备上 并且
  • 项目作为 spring mongo 中的嵌套文档

    我正在寻找一位翻译来改变这一点 getCollection migrate aggregate project Contrat Field1 Field1 Field2 Field2 Formule Field3 Field3 Field4
  • 在 Codeigniter URL 段中传递 URL

    我想传递一个网址 例如在 codeigniter 的 url 段中 我正在尝试传递这样的东西并获取 http example com test a 1 b 2 网址 做到这一点的最佳方法应该是什么 将您的 URI 协议设置为REQUEST
  • MPAndroidChart - 是否可以控制图表元素的 z-index?

    我希望在我的绘图中有以下顺序MPAndroid图表 从下到上 数据连接线 限制线 数据点 是否可以 我知道方法com github mikephil charting components AxisBase setDrawLimitLine
  • android 扫描SD卡中的所有.mp3文件

    我正在尝试扫描 SD 卡中的所有 mp3 文件并保存其名称 这是负责此操作的代码片段 1 我做错了什么 1 SD卡 mnt sdcard 或 sdcard 哪个是正确的路径 public class PlayerActivity exten
  • 对字符串使用静态变量

    以下内容摘自最佳实践 编写高效代码但我不明白为什么 private static String x example 比 快 private static final String x example 谁能解释一下这一点 对字符串使用静态变量