一、" == "
- 对于基本类型来说,比较的是值
- 对于引用类型来说,比较的是他们的引用
注:这里值得引用是什么呢,在创建引用类型的时候,会把引用存到栈中,而真正的值存储在堆中,而引用存储了值在堆中的地址
String x = "abc";
String y = "abc";
String z = new String("abc");
System.out.println(x == y); //true
System.out.println(x == z); //false
因为常量“abc”是存储在常量池的,指向的是同一个引用,所以x==y是true,而z是new的对象,他们的引用是不相同的,所以x == z是错误的
二、"equals"
在对象的equals中,本质上就还是==
但是,有特例,比如,String和Integer就重写了equals方法,他们比较的是值
请看下面的例子:
Artist artist = new Artist("资讯");
Artist artist1 = new Artist("资讯");
System.out.println(artist.equals(artist1));//false
结果为false,结果和我们预期是一样的,其实在没有重写equals方法的时候,equals方法和==相同,比较的是引用,下面是Object中equals的源码:
默认按照==比较
那请看下面这段代码:
String s = new String("aaa");
String ss = new String("aaa");
System.out.println(s.equals(ss));//true
结果为true,那为什么呢,因为在设计String的时候,重写了equals方法,请看源码:
String最终比较的是值是否相同
总结一下:
"==" 对于基本类型来说是值比较,对于引用类型来说是比较的是引用;
而 equals 默认情况下是引用比较,只是很多类重写了 equals 方法,比如 String、Integer 等把它变成了值比较