备忘记录:
String str="x";
String str1="x";
String str2=new String("x");
System.out.println(str==str1); 结果为true,String 为引用类型,会在创建str=x的时候分配堆区常量池存储“x”,编译时进行,常量池对池中数据只存储一份,当创建str1=x的时候会查看内存是否存在"x",当存在的时候,直接将变量str和str1指向同一个引用,所以“==”返回true
System.out.println(str.equals(str1)); 值相同,同值比对,返回true
System.out.println(str1==(str2)); 结果为false,str2为重新创建堆区内存,并不是在编译时进行,其值不存在于常量池中,不管“x”是否已经存在,使用“==”进行存储地址的比较,所以返回false
String str="x";
String str1="x";
String str2=new String("x");
System.out.println(str==str1); 结果为true,String 为引用类型,会在创建str=x的时候分配堆区常量池存储“x”,编译时进行,常量池对池中数据只存储一份,当创建str1=x的时候会查看内存是否存在"x",当存在的时候,直接将变量str和str1指向同一个引用,所以“==”返回true
System.out.println(str.equals(str1)); 值相同,同值比对,返回true
System.out.println(str1==(str2)); 结果为false,str2为重新创建堆区内存,并不是在编译时进行,其值不存在于常量池中,不管“x”是否已经存在,使用“==”进行存储地址的比较,所以返回false
另:
String在进行传递的时候,进行传值,并非进行引用传递,StringBuffer/StringBuilder为引用传递
String为char[]的包装类。包装类的特质之一就是在对其值进行操作时会体现出其对应的基本类型的性质。在参数传递时,包装类是按值传递的。其实String在进行引用的传递,只不过进行了引用的拷贝,并传递到函数中,所以产生了值传递的感觉。