基础巩固07-String对象的创建过程

package com.javabase.javabase.string;

import org.junit.Test;

/**
 * @Author ShawnYang
 * @Date 2019-09-27 10:34
 * @Description TODO
 * 修改人:
 * 修改时间:
 * 修改备注:
 */
public class StringTest {

    @Test
    public void stringTest01(){
        PersonForStringTest p1 = new PersonForStringTest();
        p1.name = "atguigu";
        PersonForStringTest p2 = new PersonForStringTest();
        p2.name = "atguigu";
        System.out.println(p1.name .equals( p2.name)); //true
        System.out.println(p1.name == p2.name); //true
        System.out.println(p1.name == "atguigu"); // true
        String s1 = new String("bcde");
        String s2 = new String("bcde");
        System.out.println(s1==s2); //flase
    }


    /**
     * @Author ShawnYang
     * @Date 2019/9/27 0027 11:04
     * @Description 结论: 记住 方法区 常量池中的字符串常量存在的作用就是共享数据
     *  常量与常量的拼接结果在常量池。 且常量池中不会存在相同内容的常量。
     *  只要其中有一个是变量, 结果就在堆中, 因为jvm在编译器无法确定s 所有无法取到常量池中的值,只能在运行期动态分配
     * 变量的字符串拼接实际上就是 new 了一个 StringBuilder 对象,然后使用 append 方法进拼接
     *  如果拼接的结果调用intern()方法, 返回值就在常量池中的地址值
     * 修改时间:
     * 修改备注:
     * 实现注意:
     */
    @Test
    public void stringTest02(){
        String s1="hello";
        String s2="world";
        String s3="hello"+"world";//等同于:String s3="helloworld";

        String s4=s1+"world";

        String s5=s1+s2;

        String s6=(s1+s2).intern();

        System.out.println(s3==s4);//false

        System.out.println(s3==s5);//false

        System.out.println(s4==s5);//false

        System.out.println(s3==s6);//true

    }

    /**
     * @Author ShawnYang
     * @Date 2019/9/27 0027 11:06
     * @Description 综合练习
     * 综合说明:
     *  String s1 = "a";
     * 说明:在字符串常量池中创建了一个字面量为"a"的字符串。
     *  s1 = s1 + "b";
     * 说明:实际上原来的“a”字符串对象已经丢弃了, 现在在堆空间中产生了一个字符
     * 串s1+"b"(也就是"ab")。如果多次执行这些改变串内容的操作,会导致大量副本
     * 字符串对象存留在内存中,降低效率。如果这样的操作放到循环中,会极大影响
     * 程序的性能。
     *  String s2 = "ab";
     * 说明:直接在字符串常量池中创建一个字面量为"ab"的字符串。
     *  String s3 = "a" + "b";
     * 说明: s3指向字符串常量池中已经创建的"ab"的字符串。
     * String s4 = s1.intern();
     * 说明:堆空间的s1对象在调用intern()之后,会将常量池中已经存在的"ab"字符串
     * 赋值给s4。
     *
     * 修改人:
     * 修改时间:
     * 修改备注:
     * 实现注意:
     */
    @Test
    public void testString03(){
        String str1 = "尚硅谷";
        String str2 = "尚硅谷";
        String str3 = new String("尚硅谷");
        System.out.println(str1 == str2);//true
        System.out.println(str1 == str3);//false
        System.out.println(str1.equals(str3));//true 比较的是内容
        str1 = "尚硅谷atguigu.com";
        String str4 = "atguigu.com";
        String str5 = "尚硅谷" + "atguigu.com";//字符串常量的拼接
        System.out.println(str1 == str5);//true

        String str6 = (str2 + str4).intern();
        System.out.println(str1 == str6);//true
    }


}

String使用陷阱
 String s1 = “a”;
说明:在字符串常量池中创建了一个字面量为"a"的字符串。
 s1 = s1 + “b”;
说明:实际上原来的“a”字符串对象已经丢弃了, 现在在堆空间中产生了一个字符
串s1+“b”(也就是"ab")。如果多次执行这些改变串内容的操作,会导致大量副本
字符串对象存留在内存中,降低效率。如果这样的操作放到循环中,会极大影响
程序的性能。
 String s2 = “ab”;
说明:直接在字符串常量池中创建一个字面量为"ab"的字符串。
 String s3 = “a” + “b”;
说明: s3指向字符串常量池中已经创建的"ab"的字符串。
String s4 = s1.intern();
说明:堆空间的s1对象在调用intern()之后,会将常量池中已经存在的"ab"字符串
赋值给s4。

参考:很重要
String常量池:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值