String的equals方法原理

一,前言:

        我们都知道String的equals方法,是用来比较两个字符串的内容是否是相等的

        如果比较内存地址用的是==。

        那么String的equals方法是如何来比较两个字符串的内容是否是相等的呢?

        今天一起翻翻源码看看:

·

二,源码解析:

public boolean equals(Object anObject) {
	//如果指定对象和当前对象的内存地址相等,则啥都不用说了,在内存中都是同一个对象了,直接返回true;
	if (this == anObject) {
		return true;
	}
	//如果指定对象和当前对象的内存地址不相等:
	//则判断指定对象是否是String类型,如果不是,则直接返回false;
	//如果指定对象是String类型,则继续:
	if (anObject instanceof String) {
		//则先将该对象强转为String对象:
		String anotherString = (String)anObject;
		//比较指定对象与当前对象的字符串长度,如果长度不一致,则直接返回false;
		int n = value.length;		
		if (n == anotherString.value.length) {
			//如果指定对象与当前对象的字符串长度一致,
			//则遍历这两个字符串对象中的每一个char字符,
			//如果遍历过程中有一个char字符不一致,则直接返回false;
			char v1[] = value;
			char v2[] = anotherString.value;
			int i = 0;
			while (n-- != 0) {
				if (v1[i] != v2[i])
					return false;
				i++;
			}
			//如果遍历结束,每个char字符都一致,则返回true;
			return true;
		}
	}
	return false;
}

· 

总体步骤就是:

        1,如果指定对象和当前对象的内存地址相等,则说明在内存中都是同一个对象,所以直接返回true;

        2,如果指定对象和当前对象的内存地址不相等,则判断指定对象是否是String类型;

        2.1,如果指定对象不是String类型,则直接返回false;

        2.2,如果指定对象是String类型,则继续:

        2.2.1,先将该对象强转为String类型

        2.2.2,然后比较指定对象与当前对象的字符串长度,如果长度不一致,则直接返回false;

        2.2.3,如果指定对象与当前对象的字符串长度一致,则遍历这两个字符串对象中的每一个char字符,

        2.2.4,如果遍历过程中有一个char字符不一致,则直接返回false;

        2.2.5,如果遍历结束,每个char字符都一致,则返回true;

·

char字符类型如何比较内容是否相等?

        答案就是:直接用==就行了

        因为Java采用Unicode编码,而且Unicode字符集中的前128个字符与Ascll字符集兼容, 所以在java中,char类型的数据是unicode编码字符

        所以Java中的char型数据的运算和比较,对应着一张ASCII码表。

        所以两个char类型的数据,直接用==比较即可

char类型方面,详情参见:

Java中的char类型的数据的运算和比较_Morning sunshine的博客-CSDN博客_java判断char是否相等

 ·

三,String的equals()方法 与 Object的equals()方法:

·

1)联系:

        我们都知道,在Java中,任何一个类默认都是继承自Object类;

        所以其实String也不例外,String里边的equals方法,其实是覆盖重写了Object中的equals方法。

·

2)区别:

区别也很明显:

  •         String里边的equals方法是比较两个字符串对象的内容是否是相等的;
  •         Object里边的equals方法是比较两个对象的内存地址是否是一致的,如果一致,即意味着这两个对象在内存中其实是一个对象,则返回true,否则返回false;

·

拓展: Object里边的equals方法:

public boolean equals(Object obj) {
	return (this == obj);
}

        注意,当我们写代码的时候,每当要重写Object的该equals方法时,通常都需要重写hashCode方法(也是Object类中的),以保证相等的对象必须具有相等的哈希码

·

3)使用场景的区别:

        除了String字符串类型比较内容是否相等之外,

        其他大多数的类都是继承使用的Object的equals()方法,即比较内存地址

        如果想比较类里边的内容比如说根据某个变量进行判断,那么我们需要在编写该类的时候,自己重写该Object的equals方法、以及hashCode方法。

·

举例:

        比如说,在HashMap的put方法中的判断该key是否重复的时候,有一个步骤就是:

        先判断这两个key的hashcode哈希码是否一致,

        如果两个key的哈希码一致、并且用==或者Object的equals()方法比较发现这两个key的内存地址也一致,则判断出这是同一个key,即元素重复了。

if (p.hash == hash &&
       ((k = p.key) == key || (key != null && key.equals(k))))
    e = p;

        如果两个key的哈希码一致、但是用==或者Object的equals()方法比较发现这两个key的内存地址不一致,则说明此时两个entry元素仅仅是发生了哈希冲突了,则去进行相应的处理

详情参见HashMap的put方法与get方法_Morning sunshine的博客-CSDN博客

 

  • 7
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值