java中==等于符的方方面面
程序员文章站
2022-03-01 19:49:39
...
在java中,一般都会说基本类型的比较相等用==这个比较符;对于引用类型的比较相等一般用equals方法,自定义的类型需要实现equals方法,如果用==则会比较两个对象的地址是否一样。
今天有点时间,就写了个测试,记录==到底是怎么样的。以下是demo代码:
public class Typea { public static void main(String[] args) { Integer x = 1; Integer y = 1; System.out.println(x == y);// 1. true Integer v = 128; Integer w = 128; System.out.println(v == w);// 2. false Integer m = 128; int n = 128; System.out.println(m == n);// 3. true Integer i = new Integer(1); Integer j = new Integer(1); System.out.println(i == j);// 4. false String str1 = "abcgggggggggggggggggggggggggggggedgert"; String str2 = "abcgggggggggggggggggggggggggggggedgert"; System.out.println(str1 == str2);// 5. true String str3 = new String("abcgggggggggggggggggggggggggggggedgert"); String str4 = new String("abcgggggggggggggggggggggggggggggedgert"); System.out.println(str3 == str4);// 6. false } }
这个结果有时候相等,有时候又不相等,到底是为什么?总结起来,只有两个引用指向的是同一个对象才会返回true,否则返回false。new的出来的肯定是两个对象,肯定返回false。
需要注意的就是:对于直接赋值的时候,Integer有缓存,在[-128,127]之间的数字全部缓存,所以第一个返回true,第二个返回false;String有一个常量池,直接赋值会从常量池找,找不到就创建一个放到常量池,找得到就找得到,所有第五个返回true。