==和equals()都是比较相等的,那有什么区别和联系;
1:基本类型(primitive types), 共有8种,即int, short, long, byte, float, double, boolean, char
使用==比较基本数据类型时比较的是数值是不是相等;
例如:
1 package equals; 2 3 public class Test { 4 public static void main(String[] args) { 5 int a=3; 6 int b=4; 7 int c=3; 8 b=c; 9 System.out.println(a==c); 10 System.out.println(a==b); 11 } 12 }
因为基本数据类型是在栈中的,理解堆栈就好理解这个问题,具体参考我的另一篇博客》》》堆栈 http://www.cnblogs.com/GH0522/p/8193650.html
那么当比较两个对象的时候比较的是 对象在内存的位置
1 package equals; 2 3 public class Test2 { 4 5 public static void main(String[] args) { 6 // TODO Auto-generated method stub 7 Double d = new Double(12.2); 8 Double d2 = new Double(12.2); 9 System.out.println(d==d2); 10 11 } 12 }
因为这两个对象在堆中都拥有一个不同的地址虽然里面放的数值是一样的;
JAVA当中所有的类都是继承于Object这个基类的,在Object中的基类中定义了一个equals的方法,这个方法的初始行为是比较对象的内存地址,但在一些类库当中这个方法被覆盖掉了,如String,Integer,Date在这些类当中equals有其自身的实现,而不再是比较类在堆内存中的存放地址了。例如String重写的equals方法就是比较内存中存放的值。
1 package equals; 2 3 public class Test2 { 4 5 public static void main(String[] args) { 6 // TODO Auto-generated method stub 7 String a=new String("a"); 8 String b=new String("a"); 9 System.out.println(a==b); 10 System.out.println(a.equals(b)); 11 } 12 }
看其String类中被重写的equals
没被重写的Object中的equals则是实现自==