zoukankan      html  css  js  c++  java
  • 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方法,是对地址的比较。

  • 相关阅读:
    BF算法和KMP算法
    Python课程笔记 (五)
    0268. Missing Number (E)
    0009. Palindrome Number (E)
    0008. String to Integer (atoi) (M)
    0213. House Robber II (M)
    0198. House Robber (E)
    0187. Repeated DNA Sequences (M)
    0007. Reverse Integer (E)
    0006. ZigZag Conversion (M)
  • 原文地址:https://www.cnblogs.com/dearnotes/p/12269969.html
Copyright © 2011-2022 走看看