/**
- String 是不变对象,即:
- 字符串对象创建后,表示的字符内容不可变,若改变必定创建新对象
- @author Lemon
*/
public class StringDemo {
public static void main(String[] args) {
/*
* java对于字符串有一个个优化,即:字符串常量池,这是在堆内存中开辟的一块空间,
* 用于保存所有使用该字面量形式
* 创建的字符串对象,当再次使用该字面量创建新的字符串时会直接重用而不会再创建新的来节省内存开销
*/
String s1="123abc";
//s2会重用s1创建的字符串对象
String s2="123abc";
String s3="abc";
String s4=new String("123abc");
System.identityHashCode(s4);
System.identityHashCode(s1);
System.out.println(s1==s2);//true
System.out.println(s1==s3);//false
/*
*s2与s4是两个不同的字符串对象,虽然内容都是"123abc",
*但是两个变量保存的地址不同
*/
System.out.println(s2==s4);//false
/*
* 通常我们比较字符串都是比较他们的内容,因此比较字符串(引用数据类型)我们不会使用"==",
* 而是使用字符串的方法equals.
* equals方法是用来表示两个字符串对象所表示的内容是否相同
*/
boolean tf=s1.equals(s4);
System.out.println(tf);//true
/*
* 这里用到了编译器的一个特性:
* 编译器在编译源代码时,当遇到一个计算表达式可以在编译期间
* 确定结果是就会直接进行计算,并将结果编译到class文件中,这样jvm每次运行程序是就
* 无需在计算,比如:int a=1+1;
* 编译器编译后class改为:int a=2;
* 下面的字符串也是如此,会被改成:
* String s5="123abc";
*/
String s5="123"+"abc";
//编译器编译时就把"123"+"abc"拼接成"123abc"了
System.out.println("s5:"+s5);
System.out.println(s5==s1);//true
String s="123";
String s6=s+"abc";
System.out.println("s6:"+s6);
System.out.println(s6==s1);//false