==和equals在比较字符串时候的区别
作为一个菜鸟 之前一直迷茫 都说比较字符串要用equals()方法 但是有时候用==貌似也可以 话不多说 先来一个例子
public static void main(String[] args) { String str1="str"; String str2="str"; System.out.println(str1==str2);//返回true
System.out.println(str1.equals(str2));//返回true
}
返回一个 true
再来一个用==不行的例子
public static void main(String[] args) { String str1=new String("str"); String str2=new String ("str"); System.out.println(str1.equals(str2));//返回true System.out.println(str1==str2);//返回false }
经过比较得知 new()出来的字符串不能用==比较
有以下两种原因
1、equals()方法比较的是两个对象值 而==比较的两个引用是否指向同一个对象 有些同学要问了 为什么直接=字符串和new()字符串难道不同吗? 对的 第二点就是new和=的区别
2、用=时 会在字符常量串常量池中创建 如 string s="123"; 字符串常量池不属于堆也不属于栈 这样就会在字符串常量池创建“123”(如果字符串常量池中已经有“123” 就把s引用指向它)。再创建一个string s1=“123”;
会把s1的引用指向已经存在的“123”;而不会再创建一个 这样s和s1的引用都是一样的 用==也可以判断出来
用new()时 不管字符串常量池中有没有 都到从堆内存中开辟一块空间存放 new一次 开辟一次 所以 String str1=new String("str"); String str2=new String ("str");是不同的两块空间 所以引用也就不相同的
==只会判断两个引用是否指向同一个对象(也就是同一块内存地址) 所以这时候用==是false
结论
1、==用于比较两个引用是否指向同一个对象 equals用于比较两个对象是否相等
2、由于字符串特殊 在字符串常量池中的字符串可以使用==也可以使用equals 推荐不管哪种方式 只要是比较字符串就用equals