从网上淘的 感觉不错 ==与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方法是比较的地址是否相同
}
}
如有错误请纠正
- 从网上淘的 感觉不错 ==与equals的对比
- ==与equals的对比
- java中equals与==的对比
- 感觉不错的博客
- 关于equals跟==的对比
- 从网上看到的比较不错的介绍委托
- 网上遇到的两个php写的爬虫程序,感觉不错,收集进来,一块瞅瞅:
- 网上查到关于innodb自增锁的详细完整的讲解--感觉不错
- 在网上看到的“循环和递归在算法中的应用”,感觉不错,转载一下
- 顺了一篇文章,讲hashCode和equals的,感觉不错.
- 感觉CSDN的还不错
- 感觉比较不错的书
- 感觉不错的一个帖子
- 一些感觉不错的命令
- 个人感觉不错的英文歌
- java对比==与equals
- php5.4.36中APC与APCu的对比与感觉
- 一款不错的网上笔记
- PL/SQL调用系统标准的请求实例
- dsf
- xdfv
- 常见问题小节
- POJ 1308 Is It A Tree?
- 从网上淘的 感觉不错 ==与equals的对比
- 优柔寡断的人必读忠告
- linux 2.6.32 在arm9(s3c2440)平台的移植2 -- Kconfig和Makefile(2)
- Introduction to Android Power Management
- Introduction to Android Webkit
- SqlServer2000(2005) 数据库同步方案详解
- Introduction to Android RILD
- 我回来了
- 汇编中常见的一些错误信息