在比较两个数值或者字符串的时候,我们经常用两种方法
1- 使用 ==
2- 使用equals方法
而两种方法有什么区别呢?
==是判断两个变量或实例是不是指向同一个内存空间
equals是判断两个变量或实例所指向的内存空间的值是不是相同
也就是说== 判断是你比较值的地址 而equals比较的是你两个数值是否相等。
而经过复写后的equals方法去比较两个相同的数值,返回的是true,这就说明了复写的equals比较的是属性值,而不是地址。
1- 使用 ==
2- 使用equals方法
而两种方法有什么区别呢?
==是判断两个变量或实例是不是指向同一个内存空间
equals是判断两个变量或实例所指向的内存空间的值是不是相同
也就是说== 判断是你比较值的地址 而equals比较的是你两个数值是否相等。
public class Dongruan {
/**
* @param args
*/
public static void main(String[] args) {
String a = new String("abc");
String b = new String("abc");
System.out.println(a==b);
System.out.println(a.equals(b));
}
}
a和b开创了两块内存空间, 而 == 比较的时内存地址,所以a==b返回的是false
使用equals方法比较的是两个对象的值,所以返回的是true。
我们继续来比较两个持久层的对象。
在比较两个持久层对象的时候,我们就不能直接去使用equals方法了,我们需要在pojo类中去复写一下。
在myeclipse工具的pojo类中鼠标点击右键,选择source 就能看见equals方法了,点击后就会出现复写的equals方法。
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + Id;
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + ((sex == null) ? 0 : sex.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Person other = (Person) obj;
if (Id != other.Id)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
if (sex == null) {
if (other.sex != null)
return false;
} else if (!sex.equals(other.sex))
return false;
return true;
}
我们这时进行简单的测试:
public class TestDemo {
@Test
public void selectStu(){
Configuration cig = new Configuration().configure();
SessionFactory sessionFactory = cig.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction t = session.beginTransaction();
Person p = (Person) session.get(Person.class, 4);
Person p1 = (Person) session.get(Person.class, 5);
System.out.println(p.toString());
System.out.println(p1.toString());
System.out.println(p.getName()==p1.getName());
System.out.println(p.getName().equals(p1.getName()));
t.commit();
session.close();
sessionFactory.close();
}
我们使用两组属性相同的数据进行比较
打印结果如图
而经过复写后的equals方法去比较两个相同的数值,返回的是true,这就说明了复写的equals比较的是属性值,而不是地址。
我们再去详细的去看一眼工具给我们复写的equals方法和原equals方法
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Person other = (Person) obj;
if (Id != other.Id)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
if (sex == null) {
if (other.sex != null)
return false;
} else if (!sex.equals(other.sex))
return false;
return true;
}
public boolean equals(Object obj) {
return (this == obj);
}
你会发现,在原方法中如果不是同一个obj就会直接返回false,而复写中当两个obj不同时会继续向下判断,进而比较每一条属性,这样才实现了非同内存地址相同属性的比较功能。