关于字符串创建对象与intern的解析

**关于字符串创建对象与intern的解析**


import org.junit.jupiter.api.Test;

public class Stringclass {
    public static void main(String[] args) {

    }
        /**  new String()解析**/
        @Test
        public void newString() {
            /**String string_1=new String("LR")
             * 创建两个对象 1:字符串常量池"LR"
             *            2:new出来的堆空间对象**/
            String string_1 = new String("LR");
            String string_2 = "LR";
            /**  string_1==string_2:false**/
            System.out.println("string_1==string_2:false=" + (string_1 == string_2));


            /**  涉及运算字面量与非字面量**/

            /**  字面量的运算结果如果常量池中存在 则不创建对象 注意是字面量 **/
            String string_3 = "L" + "R";
            System.out.println("string_3==string_2:ture=" + (string_3 == string_2));

            String string_4 = "L";
            /**  string_4 不是字面量 运算则是StringBuild构成
             * 对象:1 字符串常量池:"L"
             *     2 new StringBuild 对象
             *     3 字符串常量池 :"R"
             *     4 toString 对象:"LR" 堆空间中**/
            String string_5 = string_4 + "R";
            /** string_5 堆空间对象1
             *  string_1 堆空间对象2
             *  string_2 字符串对象3
             *  **/
            System.out.println("string_5==string_1:false=" + (string_5 == string_1));
            System.out.println("string_5==string_2:false=" + (string_5 == string_2));


            /**  final修饰**/
            final String string_6 = "L";
            /**  被final修饰后的运算 和字面量运算一样**/
            String string_7 = string_6 + "R";
            System.out.println("string_7==string_2:true=" + (string_7 == string_2));

            /**注意个细节: 打印false   +运算高于==  先加在==  结果输出false**/
            System.out.println("string_7==string_2:true=" + string_7 == string_2);
            /*  * 正确写法 **/
            System.out.println("string_7==string_2:true=" + (string_7 == string_2));

        }

    /**
     * intern()方法解析
     **/
    @Test
    public void intern() {
        /**字符串常量池已经存在字符**/
        String a = new String("hello");//创建两个对象 存在字符串常量池中和堆空间中
        String b = "hello";//返回的是上一行代码产生的"hello"  存在字符串常量池
        a.intern();//是整个值返回的对象  a对象指向不会改变 所以字符串常量池字符存在的话这条语句等于没用
        System.out.println("一个堆a一个字符串常量池b a==b 结果:false=" + (a == b));
        System.out.println("由于字符串中已经存在 a.intern()返回字符串常量池内容 1.6和1.7一样 a.intern()==b 结果:true=" + (a.intern() == b));
        System.out.println("证明a指向堆没有变 a==b 结果:false=" + (a == b));

        /**  字符串常量池中不存在字符时 1.6和1.7版本的区别 1.6将堆空间对象复制一份 1.7将堆空间对象地址复制一份**/

        /**加法运算 等于new StringBuild().append("ba").append("cd").toString
         * toString 方法等于new String() 但是字符串常量池中不会生成 "bacd"**/
        String c = new String("ba") + new String("cd");
        /**  对象1:"new Sting("ba");
         *   对象2:"new Sting("cd");
         *   对象3:"ba" 字符串常量池
         *   对象4:"cd" 字符串常量池
         *   对象5:"new StingBuild();
         *   对象6:"toString= new String(); "bacd"在堆里**/
        System.out.println("c.intern()返回一定是字符串常量池里面的字符 " +
                "1.6复制一份就是两个对象 1.6结果:false " +
                " 1.7复制地址 1.7结果:true= " + (c.intern() == c));

    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值