浅层了解String——Java面向对象基础(13)

一、两种创建字符串类型的方法

        String str1="Iloveyou";//str1变量值为地址值(这里存疑吧,目前水平还不够,貌似Java中是哈希码),字符串放入String常量池,不开辟新空间
        String str2=new String("Iloveyou");//str2变量为地址值(同样存疑),字符串放入堆,开辟新空间

二、几种经典场景判断

        String str0="Iloveyou";
        String str1="Iloveyou";
        System.out.println(str0=="Iloveyou");
        //相等,因为str0与其都引用自常量池中同一个字符串
        System.out.println(str0==str1);
        //相等,因为str0与str1都引用自常量池中同一个字符串    
        String str2="Iloveyou";
        String str3=new String("Iloveyou");
        System.out.println(str2==str3);
        //不相等,因为str2是引用自常量池的字符串,而str3中是引用堆中开辟的新空间
        String str4=new String("Iloveyou");
        String str5=new String("Iloveyou");
        System.out.println(str4==str5);
        //不相等,因为str4与str5中是引用堆中开辟的不同的新空间,即他们是不同的对象
        String str6="Ilove"+"you";
        System.out.println(str6=="Iloveyou");
        //相等,因为编译器合并已知量的优化功能,池中开辟一块空间,存放合并后的String常量"Iloveyou"。
        //str6引用的是常量池里的字符串,并没有在堆中开辟一块新的空间。
        String str7="Ilove";
        str7=str7+"you";
        System.out.println(str7=="Iloveyou");
        //不相等,str7=str7+"you"会导致开辟新的堆空间,str7也不再指向常量池,而是转而指向堆区。
        String s1="Ilove";
        String s2="you";
        String str8=s1+s2;
        System.out.println(str8=="Iloveyou");
        //不相等,s1 + s2通过StringBuilder的最后一步toString()方法还原一个新的String对象,str6指向新开辟的堆区
        //从而与常量池中的Iloveyou不同
        String str9="Iloveyou".substring(0,2);
        System.out.println(str9=="Il");
        //不相等,"Iloveyou".substring(0,2)会生成一个新的String对象,然后str9指向它,而非常量池中。
        String str10="Iloveyou".toUpperCase();
        System.out.println(str9=="ILOVEYOU");
        //不相等,"Iloveyou".toUpperCase()会生成一个新的String对象,然后str9指向它,而非常量池中。
原文地址:https://www.cnblogs.com/Unlimited-Rain/p/12470547.html