Пул Java String и приведение типов

Мой вопрос касается того, как Java обрабатывает строковые литералы.Из Спецификации языка Java (JLS) совершенно ясно, что строковые литералы неявно интернируются - другими словами, объекты, которые создаются в константной части пула String кучи, в отличие от объектов на основе кучи cr съедается при вызове new String("whatever").

Кажется, что не согласуется с тем, что говорит JLS, так это то, что при создании новой строки с использованием конкатенации строк с приведенным постоянным типом строки, который следует рассматривать как константную строку согласно JLS, по-видимому, JVM создание нового объекта 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 :(

    }
}
10
задан Paul Bellora 26 March 2012 в 01:45
поделиться