• 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方法,是对地址的比较。

  • 相关阅读:
    Global.asax的Application_BeginRequest实现url重写无后缀的代码
    Windows 2008驱动安装失败的原因及解决方法
    解决win8.1电脑无法安装手机驱动问题
    适用于Win8的Office2003_SP3精简版集成各类补丁+兼容包
    CSS 文本缩进,行间距
    自动换行后缩进怎么做(CSS)?(可用于 Li y 元素的排版)
    ApkTool反编译和重新打包
    sql server 2005 32位+64位、企业版+标准版、CD+DVD 下载地址大全
    【Lua】Lua中__index与元表(转)
    【VS2012】项目文件夹管理
  • 原文地址:https://www.cnblogs.com/dearnotes/p/12269969.html
Copyright © 2020-2023  润新知