String s1="123abc";//推荐
1.在栈中创建了一个名为s1的变量(引用)
2.如果String池中没有“abc”存在,则在常量池中创建一个String类型的“abc”对象,有就不创建
3.将“abc”的地址赋给s1
创建一个或者没创建新对象
String s2=new String("123abc");//不推荐,new一定会强制创建新对象
1.在栈中创建了一个名为s2的变量(引用)
2.如果String池中没有“abc”存在,则在常量池中创建一个String类型的“abc”对象,有就不创建
3.new关键字时,在堆中创建了一个String对象
4.将用new关键字创建的String对象的地址赋给s2
创建两个或者一个新对象
s1 == s2,结果为false,两者虽然内容一致,但是其实两者的指向的内存地址并不一致,而 == 会检查两者的内存地址是否一致,一致为true,不一致为false
s1.equals(s2),结果为true,因为 equals() 在检查地址不相等后,还会检查两者的内容,两者内容相等,则仍然返回true,毫无疑问,两者的内容是一致的。
package String.day01;
public class StringDemo1 {
public static void main(String[] args) {
String s1="123abc";//推荐
String s2=new String("123abc");//不推荐,new一定会强制创建新对象
String s3="123abc";
System.out.println(s1==s2);//false,s1与s2地址不相同
System.out.println(s1==s3);//true,s1与s3地址相同
s1=s1+"!";//改变内容会创建新对象
System.out.println(s1);//String为不变量,此处创建了新对象
System.out.println(s3);//此处不随s1的改变而改变
//引用数据类型“==”不仅判断值还判断地址是否相同
//此处判断字符串是否相同使用s2.equals(s3)结果为:true or false
System.out.println(s2.equals(s3));
String s4="123"+"abc";//编译期确定后,运行期不运行问题
System.out.println(s4);
System.out.println(s3==s4);//true
String s="123";
String s5=s+"abc";//此处改内容创建新对象
System.out.println(s3==s5);//false
//通过表达式表示含义
//int a=1000*24*60*60;
//比int a=86400000更能直观感受a要表示一天多少毫秒的含义
}
}