equals()和==的区别

==和equals()的区别

首先"=="是关系运算符,equals()是方法。但是同时他们的结果都返回布尔值;

我们首先思考一下什么时候经常用到"=="?
①基本类型数据做比较
②String(特殊的引用类型做比较)

1、“==”的比较

  • 基本类型,比较的是值
  • 引用类型,比较的是地址
    (基本类型比较简单,就是简单的值的比较,这里不再赘述。String类型就复杂一点,String类型是特殊的引用类型)
    我们日常大多都会遇到String类型的比较,我们以下面为例,深入一下String类型比较。
public static void main(String[] args) {
		String s1="1";
		String s2="1";
		String s3=new String("1");
		String s4="11";
		String s5="1"+"1";
		String s6=s1+s2;
		String s7="1"+s3;
		System.out.println(s1==s2); //true
		System.out.println(s1==s3); //false
		System.out.println(s4==s5); //true
		System.out.println(s4==s6); //false
		System.out.println(s4==s7); //false
	}

针对于String类型我们要考虑到一个常量池的概念,由于String默认是由final修饰的,String类型的对象默认都存放在常量池中。
①String s1="1"相当于创建了一个对象,其实s1创建的时候它会先调用String的equals()方法判断常量池中是否有该对象,如果没有就创建对象;如果有就会返回该对象的引用。

②s4和s5相等是因为String是常量,s5="1"+"1"在编译期间就已经确定了,s5="1"+"1"编译后的结果相当于s5="11"。

③对于其它的+号连接对象而产生的对象都不会加入到常量池中,相当于创建了一个新对象,比较地址后当然返回的为false了。

2、equals()的比较

equals用于String类型和对象引用类型的比较。
为什么把String类型和对象类型分开来讲,因为String类型是特殊的引用类型。

源码分析
2.1

String类中的equals方法(String类型是Object的子类,它默认重写了equals方法):

    public boolean equals(Object anObject) {
        if (this == anObject) { //先比较地址是否相同
            return true;
        }
        if (anObject instanceof String) {   //判断是否是String类型或其子类
            String anotherString = (String)anObject;
            int n = length();
            if (n == anotherString.length()) {
                int i = 0;
                while (n-- != 0) {
                    if (charAt(i) != anotherString.charAt(i))
                            return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

源码很直观,一个String类型变量和另一个对象的变量做比较(另一个对象可以是Stirng类型,也可以是任意类),当两个变量的地址相同直接返回true,不同时走下一步,另一个对象强转为String类型,两个变量的字符一 一比较。

2.2

自定义类中的equals方法,如:

		A aa  = new A();
		B bb = new B();
		aa.equals(bb);
    public boolean equals(Object obj) {
        return (this == obj);
    }

aa调用的是Object类的equals方法,是对地址的比较。

posted @ 2020-03-07 14:08  我的小鱼干嘞  阅读(320)  评论(0编辑  收藏  举报