String类型 堆/字符串池的理解

package test;

public class StringTest {

    public static void main(String[] args) {

        /**
         * 创建过程:
         * 1.检查StringPool(字符串池)里是否有"aaa"对象,这里没有,创建StringPool的字符串对象"aaa"
         * 2.在jvm堆里创建字符串对象"aaa"
         * 所以,这里创建了2个对象
         */
        String s = new String("aaa");

        /**
         * 创建过程:
         * 1.检查StringPool(字符串池)里是否有"aaa"对象,因为上面已经创建过,所以这里不再创建
         * 所以,这里并没有创建对象
         */
        String s2 = "aaa";

        /**
         * 创建过程:
         * 1.检查StringPool(字符串池)里是否有"aaa"对象,因为上面已经创建过,所以这里不再创建
         * 2.在jvm堆里创建字符串对象"aaa"
         * 所以,这里创建了1个对象
         */
        String s3 = new String("aaa");

        /**
         * intern方法的作用:返回调用对象的字符串池里的字符串对象的引用
         */
        String s4 = s.intern();

        String hello = "hello";
        String hel = "hel";
        String lo = "lo";

        /**
         * 打印true
         * 如果右边计算不涉及变量计算,全部都是常量,不会产生新的对象
         * 所以返回的是字符串池里的对象引用
         */
        System.out.println(hello == "hel" + "lo");
        /**
         * 打印false
         * 右边计算涉及变量计算,有对象操作,会产生一个新的对象
         * 所以返回的是堆的对象引用
         */
        System.out.println(hello == "hel" + lo);
    }

}


猜你喜欢

转载自blog.csdn.net/mweibiao/article/details/80557102