加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java字符串池和类型转换

发布时间:2020-12-14 16:31:29 所属栏目:Java 来源:网络整理
导读:我的问题是 Java处理字符串的方式.从 Java语言规范(JLS)中可以清楚的说,字符串文字被隐式地嵌入 – 换句话说,是在堆的String常量池部分中创建的对象,与在调用新字符串时创建的基于堆的对象相反(“随你”). 什么似乎不符合JLS所说的那样,当使用String连接与一
我的问题是 Java处理字符串的方式.从 Java语言规范(JLS)中可以清楚的说,字符串文字被隐式地嵌入 – 换句话说,是在堆的String常量池部分中创建的对象,与在调用新字符串时创建的基于堆的对象相反(“随你”).

什么似乎不符合JLS所说的那样,当使用String连接与一个转换的常量String类型创建一个新的String时,它应该被视为一个JLS的常量String,显然JVM正在创建一个新的字符串对象,而不是隐含地实现它.我感谢关于这个特定行为的任何解释,以及这是否是平台特定的行为.我在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 :(

    }
}

解决方法

在编译时常数表达式中不允许转换为对象.唯一允许的演员是String和原语. JLS(Java SE 7版)第15.28节:

> – Casts to primitive types and casts to type String

(实际上有第二个原因,对象不是最终的,所以不可能考虑一个constant variable.“原始类型或类型String的变量,即最终的,并且使用编译时常量表达式(§15.28)初始化,称为常数变量“ – 第4.12.4节)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读