Java字符串池和类型转换

前端之家收集整理的这篇文章主要介绍了Java字符串池和类型转换前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我的问题是 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节)

猜你在找的Java相关文章