从网上淘的 感觉不错 ==与equals的对比

来源:互联网 发布:淘宝联盟怎么分享链接 编辑:程序博客网 时间:2024/06/04 19:08

在Java中,Object是所有类的超类。Object中有两个方法:equals()和hashCode()。所有的类都会继承这两个方法。而在Object中equals()方法的默认实现与==运算符相同,都是比较对象在内存中的地址是否相同。例如:

Test test1=new TestI();

Test test2=new Test();

Test test3=test1;

System.out.println(test1.equals(test2));

System.out.println(test3.equals(test1));

System.out.println(test1==test2);

System.out.println(test1==test3);

输出为false,true,false,true。

        在jdk类库中,有些类重写了Object中的equals()和hashCode()方法,比如String等,该类中的equals()方法比较两个字符串的值是否相等而不需要他们的内存地址相等。例如:

String str1=new String("hello");

String str2=new String("hello");

System.out.println(str1.equals(str2));

System.out.println(str1==str2);

输出为true,false。

所以在使用这些类的equals()方法时,与超类Object中的意义是不同的。倘若自己自定义的一个类,它默认继承Object,所以自定义类中的equals()方法与Object中的行为一样,除非自己重写equals()方法。

 

自己的话:

原来在object类中定义的equals方法是和==一样的 都是针对内存地址是否相同 难怪一个好的类要复写equals()hashCode()方法 还有toString()方法

 

在String类中复写的equals方法去掉了对内存地址的比较 当String s1 与String s2的值相同时都指向了同一个内存地址 这可能也和String的值不可变有一定的关联吧

 

 

 

一下是详细实例:

 

class Person
{
 String name;
 int age;

 public Person(String name,int age){
  this.name = name;
  this.age = age;
 }
 
 public boolean equals(Object obj){ //equals的所比较的是两个对象的内容
  if(obj == null) return false; //确保obj对象不是null 如果是null就没有比较的意义了
  if(this == obj) return true; //当this和obj所指向的地址相同时 说明他们两个的内容相同
  if(!(obj instanceof Person)) return false; //如果obj不是person类的对象 那this和obj就不具有可比性了 肯定不相同
  Person p = (Person)obj; // 将obj向下转型 使obj成为person类的对象  以便用来调用Person的属性 从而可以比较两个对象的内容
  if(this.name.equals(p.name)&&this.age == p.age) return true; //用比较两个对象的内容是否相同 而忽略的他们的地址
  else return false;
 }

 public int hashCode(){
  return this.name.hashCode() * 12 + this.age *33;
 }
 

 public String toString(){
  return "姓名: " + this.name + " 年龄: " + this.age;
 }
}

public class TestDemo03
{
 public static void main(String args[]){
  Person p1 = new Person("bekeer",24);
  Person p2 = new Person("wanHuan",23);
  Person p4 = new Person("bekeer",24);
  Person p3 = p1;
  //System.out.println("p1与p2的比较:"+p1.equals(p2));
  //System.out.println("p2与p3的比较:"+p2.equals(p3));
  //System.out.println("p1与p3的比较:"+p1.equals(p3));
  //System.out.println(p1==p3);
  System.out.println("p1.hashCode() : " + p1.hashCode());
  System.out.println("p2.hashCode() : " + p2.hashCode());
  System.out.println("p3.hashCode() : " + p3.hashCode());
  System.out.println("p4.hashCode() : " + p4.hashCode());
  //System.out.println(p1 == p4);
  System.out.println(System.identityHashCode(p1));
  System.out.println(System.identityHashCode(p2));
  System.out.println(System.identityHashCode(p3));
  System.out.println(System.identityHashCode(p4));
  //System.out.println("p1与p4的比较:" + p1.equals(p4)); //object类中的equals方法是比较的地址是否相同
 }
}

 

如有错误请纠正

原创粉丝点击