Java基础------equals方法
记得之前学习java基础的那会儿觉得这个方法是真的神奇,字符串对象调用它就可以判断两个字符串的内容是否相同。而Object对象调用它判断的却是对象的内存地址是否相同。
此后在做字符串内容是否相同的判断时,我总是会想到equals方法,直到最近我发现另一种语法貌似也可以达到相同的效果,StringUtils.pathEquals("qwe", ""),不过这个方法不是今天的主角,它让我忽然想起我一直没有好好去了解一下String类下的equals方法是如何实现的?首先,先来看一下Object类中的equals方法:
public boolean equals(Object obj) { return (this == obj); }
实际上只有一行代码,就是判断一下两个Object对象的内存地址是否相同,也就是说这两个对象是否为同一个。
调用这个方法的话,即便是两个对象的内容完全相同,在内存地址不同的情况下,依然会返回null。
public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = value.length; if (n == anotherString.value.length) { 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类重写后的equals方法,首先还是判断了内存地址是否相同,如果内存地址相同的话说明二者是同一个对象,那么内容自然也是相同的,直接返回true即可。
然后判断传入的对象是否为String类的实例,如果不是则直接判定为false。
然后将传入对象转为String,获取到二者的value,这东西实际上是一个字符数组,也就是String的本体所在,首先对比长度,长度如果不一致,则内容一定不一致,长度一致则将字符数组中的元素取出一一对比,如果皆一致则判定为内容一致。
这小小的一个方法封装的很细致,也很严谨,值得学习。