Chinaunix首页 | 论坛 | 博客
  • 博客访问: 16071
  • 博文数量: 17
  • 博客积分: 1410
  • 博客等级: 上尉
  • 技术积分: 165
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-10 01:17
文章分类

全部博文(17)

文章存档

2011年(2)

2010年(15)

我的朋友
最近访客

分类: Java

2010-09-16 15:11:58

一、object超类中的equals和==的使用

equals比较的是两个对象的用指向的地址是否相等(没被重写前)

== 比较的也是两个对象的引用的地址是否相等,并非其内容


Person2 p1 = 
new Person2("JUN", 25);

Person2 p2 = new Person2("JUN", 25);

Person2 p3 = p1;//表示p1的另一个名称是p3而已

System.out.println(p1.equals(p2));

System.out.println(p1.equals(p3));

System.out.println("p1 == p2:"+ (p1 == p2));

System.out.println("p1 == p3:"+(p1 == p3));

运行的结果为:

false

true

p1 == p2:false

p1 == p3:true

在object类下即equals方法还没有被重写前,equals和==比较的都是两个对象的引用的地址是否一样。而equals方法是可以被重写的,可以重写成判断两个对象的引用的内容是否相等。

重写equals方法:


public boolean equals(Object obj) {
                if( obj != null){
                        if( obj instanceof Teacher){
                Teacher t =(Teacher)obj;
                if(t.name.equals(this.name) && t.age == this.age){
                    return true;
                }else{
                    return false;
                }
            }else{
                return false;
            }
        }else{
            return false;
        }
    }

通过重写后的equals方法比较的是两个对象的引用的内容是否相等,而比较两个对象引用的地址是否相等仍然可以用==进行比较。

二、String类型中的equals方法和==的使用

 1、有2种办法可以去创建String的对象

1String str= new String(JUN);(通过new构造器的方法)

2String str2 = “JUN;(通过普通语法)


String str = “JUN;

String str2 = “JUN;

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

     程序在运行的时候会创建一个字符串缓冲池当使用 str2 = "JUN" 这样的表达是创建字符串的时候,程序首先会在这个String缓冲池中寻找相同值的对象,在第一个程序中,str1先被放到了池中,所以在str2被创建的时候,程序找到了具有相同值的 s1, 将s2引用s1所引用的对象"JUN"。(str和str2由于内容相同,那么都是指向同一个地址)

     所以,比较的是2个对象的栈的地址是否一样,内容是存放在栈的空间里面去,只要内容相等,那么栈的空间就相等,结果为true

String str3 = new String(“JUN);

String str4 = new String(“JUN);

System.out.println(str3 == str4);

通过new构建字创建的新对象,是直接告诉程序要新的对象,而不是指向已存在的,值相同但是地址不相同。

所以,比较的是2个对象的堆的地址是否一样,内容eric是分别存放在str3str4的引用里面去,相当于堆的地址空间。结果为false。


       String str5 = “JUN;

       String str6 = new String(“JUN);
       System.out.println(str5 == str6);

一个是存放在栈的空间,一个是存放在堆的空间,结果为false


在String类型中使用equals方法进行比较的都是比较内容是否相等,而 == 比较的是对象内容还是地址则要看其对象的创建方法,要是普通方法创建的就比较的是内容,要是通过new构造器创建的则是比较器对象的地址。




阅读(380) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~