欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

equals和==的区别

程序员文章站 2022-06-06 23:30:21
...

        这两天一直在看数据结构和算法,看到一些内容就想起了龙哥曾经讲过的“equals”和“==”的区别,于是重新回顾梳理了一遍,更加深了印象。现在做一下比较:

 

要辨别“equals”和“==,首先必须明白两个概念“值传递”和“引用传递”。

 

简单来说,“值传递”就是当你创建一个对象的时候(注意啊:int一个整型也是创建对象),JVM在内存中给你的这个对象开辟了一块地址;“引用传递”就是不重新分配内存资源,只是把你新声明(注意是声明啊,并没有实例化一个对象)的对象指向了一个已经在内存中有的对象,即两个对象名同指一处地址,当然我更改这个对象的值后,两个对象名所指向的这个对象的值都变了。

(ps:这个地方被大神指出有误,部分地方博主进行了更改,划掉的区域是被指出有误的地方,为避免难以看懂评论,特作此处理。博主另写了一篇博文对内存分配中的"栈"与"堆"进行了分析)

 

这里还要强调一下“new”,这是实例化对象的标识,也就是在内存中重新分配空间的标识。(关键字new为每个对象申请内存空间,除基本类型,且所有的对象都在堆heap中分配空间)我们通常用的时候,例如比较字符串,“equals”比较的是这两个字符串的值是不是一样,而“==”则比较的是这两个字符串的引用地址是否一样。例如下面的代码示例:

/**
 * 字符串中“equals”和“==”对比示例 
 * @author 赵广超
 */
public class equalsTest {
	public static void main(String[] args) {

		String aaa =new String("abc");
		String bbb =new String("abc");
		String ccc ="abc";
		String ddd=aaa;
		
		if(aaa == bbb){
			System.out.println("aaa == bbb");
		}else{
			System.out.println("aaa  != bbb");
		}
		if(aaa.equals(bbb)){
			System.out.println("aaa equals bbb ");
		}else{
			System.out.println("aaa not equals bbb ");
		}
		if(aaa == ccc){
			System.out.println("aaa == ccc");
		}else{
			System.out.println("aaa  != ccc");
		}
		if(aaa.equals(ccc)){
			System.out.println("aaa equals ccc ");
		}else{
			System.out.println("aaa not equals ccc ");
		}
		if(bbb == ccc){
			System.out.println("bbb == ccc");
		}else{
			System.out.println("bbb  != ccc");
		}
		if(bbb.equals(ccc)){
			System.out.println("bbb equals ccc ");
		}else{
			System.out.println("bbb not equals ccc ");
		}
		if(aaa == ddd){
			System.out.println("aaa == ddd");
		}else{
			System.out.println("aaa  != ddd");
		}
		if(aaa.equals(ddd)){
			System.out.println("aaa equals ddd ");
		}else{
			System.out.println("aaa not equals ddd ");
		}
		if(bbb == ddd){
			System.out.println("bbb == ddd");
		}else{
			System.out.println("bbb  != ddd");
		}
		if(bbb.equals(ddd)){
			System.out.println("bbb equals ddd ");
		}else{
			System.out.println("bbb not equals ddd ");
		}
		if(ccc == ddd){
			System.out.println("ccc == ddd");
		}else{
			System.out.println("ccc  != ddd");
		}
		if(ccc.equals(ddd)){
			System.out.println("ccc equals ddd ");
		}else{
			System.out.println("ccc not equals ddd ");
		}
	}
}

 

结果如下:

        aaa  != bbb 

        aaa equals bbb  

        aaa  != ccc 

        aaa equals ccc  

        bbb  != ccc 

        bbb equals ccc  

        aaa == ddd 

        aaa equals ddd  

        bbb  != ddd 

        bbb equals ddd  

        ccc  != ddd 

        ccc equals ddd  

 

 

对上面的结果我们可以做如下解释:

 

String aaa =new String("abc");

        String bbb =new String("abc");

        String ccc ="abc";

        String ddd=aaa;
equals和==的区别
            
    
    博客分类: Java学习笔记 equals==值传递引用传递 
 

       左边的代码在内存中分配的结果如右边所示:故有控制台的打印信息 即“equals“比较的是两个值是不是一样,而”==“比较的是内存地址是不是相同。

    可是,实际的并不总是这样的。String类中的Equals这个方法重写了超类Object(Object类被所有的其他类继承)中的equals方法。而Object超类中有如下代码:

public boolean equals(Object obj) {
	return (this == obj);
    }

 

就是说,超类中的equals==是一码子事,比较的都是内存地址。

String类中,重写的equals方法代码如下:

 

 public boolean equals(Object anObject) {
	if (this == anObject) {
	    return true;
	}
	if (anObject instanceof String) {
	    String anotherString = (String)anObject;
	    int n = count;
	    if (n == anotherString.count) {
		char v1[] = value;
		char v2[] = anotherString.value;
		int i = offset;
		int j = anotherString.offset;
		while (n-- != 0) {
		    if (v1[i++] != v2[j++])
			return false;
		}
		return true;
	    }
	}
	return false;
    }

 

       可见,在不同的类中,引用equals方法时,可能会有不一样的效果。这就提醒我们在编写自己的类时,如果要比较的话,要注意重写Object类中的equals方法。

 

——2013.1.3写于新校区图书馆

 

 强烈建议转至痴情研究java内存中的对象一文进行深入探究

 

  • equals和==的区别
            
    
    博客分类: Java学习笔记 equals==值传递引用传递 
  • 大小: 16.2 KB