Java 字符串池和类型转换

2024-01-29

我的问题是关于 Java 处理字符串文字的方式。从 Java 语言规范 (JLS) 可以清楚地看出,字符串文字是隐式驻留的 - 换句话说,在堆的字符串常量池部分中创建的对象,与调用时创建的基于堆的对象形成对比new String("whatever").

似乎与 JLS 所说的不一致的是,当使用 String 连接与强制转换的常量 String 类型创建新的 String 时,根据 JLS 应将其视为常量 String,显然 JVM 正在创建一个新的 String String 对象而不是隐式地实习它。我很欣赏有关此特定行为以及这是否是特定于平台的行为的任何解释。我正在 Mac OSX Snow Leopard 上运行。

public class Test
{
    public static void main(String args[])
    {
        /*
            Create a String object on the String constant pool
            using a String literal
        */
        String hello = "hello";
        final String lo = "lo"; // this will be created in the String pool as well
        /*
            Compare the hello variable to a String constant expression
            , that should cause the JVM to implicitly call String.intern()
        */
        System.out.println(hello == ("hel" + lo));// This should print true
        /*
            Here we need to create a String by casting an Object back
            into a String, this will be used later to create a constant
            expression to be compared with the hello variable
        */
        Object object = "lo";
        final String stringObject = (String) object;// as per the JLS, casted String types can be used to form constant expressions
        /*
            Compare with the hello variable
        */
        System.out.println(hello == "hel" + stringObject);// This should print true, but it doesn't :(

    }
}

投射到Object不允许出现在编译时常量表达式中。唯一允许的强制转换是String和基元。 JLS(Java SE 7 版)第 15.28 节:

> - 转换为原始类型并转换为 String 类型 http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.28

(实际上还有第二个原因。object isn't final所以不可能被认为是常数变量 http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.12.4。 “原始类型或类型的变量String, 那是final并用编译时常量表达式(第 15.28 节)进行初始化,称为常量变量。”——第 4.12.4 节。)

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

Java 字符串池和类型转换 的相关文章

随机推荐

  • iOS 推送通知:找不到有效连接

    我正在尝试在本地解析服务器上设置推送通知 尝试发送推送时出现此错误 parse server push adapter APNS cannot find vaild connection for 9a86 21 每个安装设备令牌都会重复该错
  • 如何从 Ant 将参数传递给 Junit 测试?

    我在Ant下使用Junit执行Selenium测试 我的测试用例需要读取文件 其中包含测试数据 以完成数据驱动测试 我不介意在测试用例中嵌入文件名 但我想知道该文件所在的目录的名称 数据文件参数化存储在 build xml 文件中 将此类信
  • 从泛型函数中的枚举获取 rawValue

    2015 年 8 月 28 日更新 这将在 Swift 2 中得到解决 See Swift 编译器开发人员在 Twitter 上的回应 https twitter com evermeer status 636791736191320064
  • Arel:来自 Arel::SelectManager 的带有 join 的活动关系

    让我们有一个 Rails 4 2 x 应用程序 我们有两个表 posts 和authors 我们想使用 Arel 来获取由 name Karl 的作者撰写的帖子 在本例中 我们可以对 Active Record 连接感到满意 但这只是为了使
  • Azure 网站上的经典 ASP 网站,远程 mysql 数据库

    我已将一个经典的 asp 网站复制到新的 Azure 网站 并尝试让它连接到远程 MySQL 数据库 远程数据库未托管在 Azure 上 我收到一条内部服务器错误消息 详细日志似乎表明我的连接字符串存在问题 当前字符串设置如下 databa
  • WPF 应用程序仅是托管代码吗?

    我想在应用程序中使用 WPF 我想用C 写它 是否必须管理应用程序 我知道我可以将托管与非托管混合在一起 我想知道是否可以让整个应用程序不受管理 您可以轻松地使用非托管代码开发 99 的 WPF 应用程序 但使其 100 不受托管是相当困难
  • 如果字符串中的项目与列表中的项目匹配,则替换该项目

    我正在尝试从字符串中删除与列表匹配的单词 x How I Met Your Mother 7x17 HDTV LOL VTV Mon 20 Feb 2012 tags HDTV LOL VTV x264 DIMENSION XviD 720
  • CGImageSourceCreateWithURL 始终返回 NULL

    我需要在不加载或下载图像的情况下读取图像的属性 事实上 我已经实现了一个简单的方法 使用 CGImageSourceCreateWithUrl 来完成此任务 我的问题是它总是返回错误 因为似乎 imageSource 为空 那么我能做些什么
  • 有没有办法创建一个公共输出流对象以在控制台上打印并在 C++ 中打印到文件?

    我正在编写一个代码 必须在控制台上打印相同的数据并打印到文件中 有没有办法填充公共输出流对象 然后使用 cout 将其显示在控制台上 并使用 fstream 和 iostream 库将其导出到文件 当然 您只需创建一个合适的流缓冲区 它可能
  • 有没有办法为 Eclipse 工具提示添加延迟?

    我发现了本文 http eclipseone wordpress com 2010 08 24 configure tooltips in eclipse to only popup on request 关于使用 Shift 键在需要时弹
  • 膨胀类片段时出错

    我收到错误 Unable to start activity ComponentInfo de androidbuch activiti de androidbuch activiti task Activity android view
  • 无法运行 python-bluez RFCOMM 服务器示例脚本

    我正在尝试在我的 Android 应用程序和 Raspberry Pi 3 之间建立蓝牙通信链接 我尝试在我的 Raspberry Pi 上使用 pybluez 我的问题是 当我尝试运行 pybluez 附带的示例代码 见下文 时 我收到以
  • UIView 不透明属性

    The opaqueUIView 的属性默认情况下始终设置为 YES 但 UIView 类参考指出了这一点 不透明视图应该用完全不透明的内容填充其边界 即内容的 alpha 值应为 1 0 如果视图不透明并且未填充其边界或包含完全或部分透明
  • SQL Azure 中的 Code First 迁移 - 不支持没有聚集索引的表

    我似乎无法通过代码优先迁移来创建 SQL Azure 数据库 它一直抱怨 SQL Azure 缺乏对没有聚集索引的表的支持 而且我找不到创建数据库的方法 Note 我在用着CreateDatabaseIfNotExists在第一次创建数据库
  • Bitmap.Save,巨大的内存泄漏

    我有一个应用程序 我正在获取位图并使用 GZipStream 压缩它并通过套接字发送它 所有这些都在内存中 我已经将肮脏的渣男内存泄漏追踪到以下行 frame Save inStream jpegCodec parameters 浏览良好的
  • 如何使用 Fluent Bit 递归上传目录中的所有日志?

    使用 Fluent Bit 上传目录 INPUT Name tail Path var log 只处理直接位于 var log 下的文件 但不处理子目录中的文件 我也尝试过使用 语法 但 Fluent Bit 不支持此 有没有办法使用 Fl
  • 如何在asp .net core 3.1中设置请求超时

    从 Visual Studio 中选择创建新项目 选择 ASP NET Core 3 1 在 IIS 中发布和托管 增加上传文件大小此代码 public void ConfigureServices IServiceCollection s
  • 如何用CSS制作水平滑动无限动画?

    我正在尝试制作一个包含 3 行图像的无限水平滑块 It looks like this 但正如您所看到的 当图像行的末尾到达时 图像最终再次出现时会出现巨大的空白 您可以在这里进行实时测试 http jsfiddle net tberger
  • 将组件放置在任意 (x,y) 坐标处

    我想将一些按钮放在JPanel在随机位置 x y 这些布局类很烦人 这在 Swing 中可能吗 如果使用空布局 则可以设置坐标 panel setLayout null Button b new Button panel add b b s
  • Java 字符串池和类型转换

    我的问题是关于 Java 处理字符串文字的方式 从 Java 语言规范 JLS 可以清楚地看出 字符串文字是隐式驻留的 换句话说 在堆的字符串常量池部分中创建的对象 与调用时创建的基于堆的对象形成对比new String whatever