equals方法详解(源码分析)

equals方法

定义:equals是Object类中的方法,用来判断引用类型是否相等(默认判断地址是否相等)

注意:因为equals是java.lang.Object(默认引入java.lang包)类中的方法,所有的类都会继承这个方法,八大基本数据类型、String等子类重写了equals方法(用于判断内容是否相等)

equals()方法与==的区别

  • ==判断基本数据类型时,判断值是否相等;判断引用数据类型时,判断地址是否相等

  • equals只用来判断引用类型,默认是判断地址,但是往往子类会重写equals方法用于判断值是否相等,比如String类、Integer类等等

    String str1 = new String("nihao");
    String str2 = new String("nihao"); 
    System.out.println(str1 == str2);//false,地址(对象)不同 
    System.out.println(str1.equals(str2));//true,比较里边的内容
    

    为什么?看下面的源码分析


在idea中查看源码:光标定位到equals方法,用快捷键ctrl + B(idea会默认配置好JDK源码)或者输入String(查哪个类重写的输入哪个子类,例:Integer),光标移动到此处,ctrl+B,左侧打开Structure寻找equals方法。

Object类中equals方法的源码

public boolean equals(Object obj) {
    	//this表示当前对象,判断地址/对象是否相同
        return (this == obj);
    }

下面是String类中equals的源码分析(JDK8)

属性:

//String的内部是用的char型数组来存储字符串
private final char value[];

equals方法:

public boolean equals(Object anObject) {//判断字符串是否相等
			//this是当前对象
			//this和anObject都是引用类型,此时比较的是地址是否相同,因为地址如果相同,指向的值肯定相同
	        if (this == anObject) {
	            return true;
	        }
	        //判断obj是否是String类型的对象
	        if (anObject instanceof String) {
	        	//向下转型,因为要访问子类String的成员
	            String anotherString = (String)anObject;
	            //因为value是数组,可以用length得到元素个数
	            int n = value.length;
	            //两者长度一样才进行值判断
	            if (n == anotherString.value.length) {
	            	//把两个对象中的value属性的元素一个个进行比较
	            	//只要有一个不相同,就返回false
	            	//全部相同则返回true
	                char v1[] = value;
	                char v2[] = anotherString.value;
	                int i = 0;
	                while (n-- != 0) {
	                    if (v1[i] != v2[i])
	                        return false;
	                    i++;
	                }
	                return true;
	            }
	        }
	        return false;//不是String类型的对象或者字符串长度不同
}
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值