zoukankan      html  css  js  c++  java
  • java == 与 equals 相同与不同点

    java中与很多有意思又值得深究的点。

    写这篇文章呢,是由于在百度知道中看到一个问题:怎样比较两个对象是否相同。这又使我想到了另外一个问题,== 和 equals有什么不同?写了几行代码,看了几篇文章,将见解列出来,分享。

    在阐述之前请大家先看一段代码。

    public class Equals {
        public static void main(String[] args) {
            Integer int1 = new Integer(1);
            Integer int2 = new Integer(1);
            
            String str1 = new String("Hello World");
            String str2 = new String("Hello World");
            
            if(int1==int2){
                System.out.println("int1 == int2");
            }
            if(int1.equals(int2)){
                System.out.println("int1 equals int2");
            }
            
            if(str1==str2){
                System.out.println("str1 == str2");
            }
            if(str1.equals(str2)){
                System.out.println("str1 equals str2");
            }
        }
    }

    输出结果:

    int1 equals int2
    str1 equals str2

    各位也都知道,java中万物皆对象。那么也有,java中所有声明出来的对象全都继承Object对象。

    第一次看到这段代码的输出结果我也是很吃惊的,很奇怪啊。我奇怪的地方有两点:

    1、int1和int2的值明明相等,可是却不是==,非常奇怪。

    2、int1和int2明明是两个对象,可是却能equals相等,更加奇怪。

    对于1,我奇怪的是==比较的是数值相等啊。可是两个明明相等的值却不想等。可是后来查了很多资料之后看到了这么一句话:

    对于==,如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;

    如果作用于引用类型的变量,则比较的是所指向的对象的地址;(引用,原文链接在文末)

    这就很明了了,也就是说==在比较的int1和int2的时候比的对象的地址,那么分别两次new出来的对象地址自然不可能相同。

    对于2,

    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;
        }

      则可以看到,在String或者Integer中都可以看到,java对Object的equals方法进行了重写都分别比较的是对象的值。所以才会有第二种结果的产生,其实仔细想想也是,总不可能没有能够正确比较的方法吧。

     public boolean equals(Object obj) {
    	if (obj instanceof Integer) {
    	    return value == ((Integer)obj).intValue();
    	}
    	return false;
        }
    

      

    总结,即:

     1)对于==,如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;

        如果作用于引用类型的变量,则比较的是所指向的对象的地址

     2)对于equals方法,注意:equals方法不能作用于基本数据类型的变量

        如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;

        诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容

    原有两段话的原文地址:http://www.cnblogs.com/dolphin0520/p/3592500.html

  • 相关阅读:
    C语言小项目-基于TCP协议和SOCKET编程的网络通信系统
    c语言小项目-使用mysql数据库的图书管理系统
    常用功能函数-密码登陆函数
    C++小项目-吃豆子游戏
    C语言小项目-火车票订票系统
    使用单向链表保存大量数据的基础程序框架
    Oracle创建用户并赋予权限
    Fibonacci sequence 求余数
    sizeof运算符来获取各种数据类型在内存中所占字节数--gyy整理
    C++不同进制整数
  • 原文地址:https://www.cnblogs.com/yidiandhappy/p/6397635.html
Copyright © 2011-2022 走看看