1.==
对于基本数据类型的比较,比较两者的值。
对于引用数据类型的比较,比较的却是引用(内存地址)。
2.equals
equals是object类中的方法,他比较的是对象的引用,可以理解为值,因此对于重写了了equals方法的比较的是他们的值。
如果没有重写equals方法则比较的是对象的引用。
Student s1 = new Student("a");
Student s2 = new Student("a");
s3 = s2;
s1 == s2;
s2 == s3;
s1.equals(s2);
s2.equals(s3);
s1 == s2返回的是false.
s2 == s3返回的是true.
s1,s2是new出来的Student的两个对象,在栈空间中会有s1,s2两个对象引用,分别指向堆空间中的对象。当用==比较时,比的
引用,因此返回false,s2与s3是同一个对象的引用,因此返回true.
而equals比较的是对象
s1.equals(s2)如果Student类重写了equals方法,返回的为true,没有重写equals方法,返回的为false.
s2.equals(s3)返回true
String str1 = "java";
String str2 = "java";
String Str3 = new String( "java");
String Str4 = new String("java");
String类型重写了equals方法,因此”equals“比较的是字符串是否一致,而”==“比较的还是字符串的引用。
但是为什么str1 == str2 返回true,因为常量池的特点。字符串常量不能重复出现,也就是说,有多个常量时,编译器先会去常量池查找该常量是否已经存在,如果不存在,则在创建一个新的字符常量,因此str1,str2指向的是常量池中同一个字符常量,str1,str2中的引用是同一个引用。
Str3.equals(Str4)返回true.对象的值一样。
Integer i1 = 2; Integer i2 = 2; System.out.println(i1 == i2); //返回true System.out.println(i1.equals(i2));//返回true
BigDecimal b1= new BigDecimal(4.00); BigDecimal b2 = new BigDecimal(4.0); System.out.println(b1.equals(b2)); //返回ture System.out.println(b1 == b2); //返回false
包装类中BigDecimal 是个特例,由于其精度,产生的结果或有所不同