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常量池: