1 简介
·equals ·方法是定义在 Object 类中的一个方法
具体可以看我的另一篇文章: Java中的equals方法
2 equals和==的区别
2.1 字符串
对于字符串来说:
- “
==
” 比较的是两个字符串在内存中的首地址 - “
equals
” 比较的时候两个字符串的内容
/* Test1 */
String s1 = "abc";
String s2 = "abc";
System.out.println("s1 == s2 : " + (s1 == s2));
System.out.println("s1.equals(s2) : " + s1.equals(s2));
Output:
s1 == s2 : true
s1.equals(s2) : true
s1 和 s2 的内容相同,都是"abc",所以 equals
的结果为 true
s1 和 s2 是两个对象,为什么 “==
” 的结果也为 true
呢?
答:在程序创建的时候,会创建一个字符串缓冲区,以 String s1 = "abc"
形式创建的字符串,程序会再缓冲区中寻找或创建值为 “abc
” 的首地址并引用,当创建s2
的时候,程序发现缓冲区中已经有相同的内容,所以 s2
直接引用这块地址,所以s1
和s2
引用了同一块地址,所以"==
"为 true
。
/* Test2 */
String s1 = "abc";
String s2 = new String("abc");
System.out.println("s1 == s2 : " + (s1 == s2));
System.out.println("s1.equals(s2) : " + s1.equals(s2));
Output:
s1 == s2 : false
s1.equals(s2) : true
在 Test2 中 “s1 == s2
” 就不再为true
了,这是因为s2
的声明方式为 String s2 = new String("abc");
它的意思是请求在缓冲区中重新开辟一段内存在存放字符串 “abc
” 所以它的 s1
的 “abc
” 虽然内容相同,但是它们的首地址不相同。
/* Test3 */
String s1 = new String("abc");
String s2 = new String("abc");
System.out.println("s1 == s2 : " + (s1 == s2));
System.out.println("s1.equals(s2) : " + s1.equals(s2));
Output:
s1 == s2 : false
s1.equals(s2) : true
Test3 中 s1 和 s2 都是通过new
出来的字符串,结果与 Test2 一样,同理。
2.2 非字符串
对于非字符串对象来说
- equals 和 == 的作用相同,都是用来比较对象实例在内存中的首地址
那么有人就要问了,字符串也是对象,为什么和非字符串对象不同的?
答:在一般情况下,equals
方法定义在 Object 类中,所以一般类使用的是 “祖宗” 类 Object 类中的equals
方法,查阅源码如下:
public boolean equals(Object obj) {
return (this == obj);
}
我们知道想要 equals 达到自己想要的效果,必须复写equals
方法,所以为什么 String 类的 equals
方法有所不同呢?当然是 String 类中的 equals
方法被复写了,查阅源码如下:
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;
}
阅读 equals
方法后,很容易发现,复写的equals
方法比较的是两个字符串的内容
2.3 基本类型
对于 Java 中的基本类型:
byte, short, char, int, long, float, double, boolean
1. 用 “==
” 比较的是两者的值是否相同,如(其他类似):
int a = 1;
int b = 1;
System.out.println("a == b : " + (a == b));
Output:
a == b : true
需要注意的是:基本类型是没有equals
方法的,如:a.equals(b)
是没有这种语法的。
2.4 包裹类型
对于Java中的包裹类型:
Boolean, Character, Byte, Shot, Integer, Long, Float, Double
1. “==
” 是来比较两者的首地址是否相同
2. “equals
” 是比较两者的内容是否相同
Integer a = new Integer(1);
Integer b = new Integer(1);
System.out.println("a == b : " + (a == b));
System.out.println("a.equals(b) : " + a.equals(b));
Output:
a == b : false
a.equals(b) : true
3 总结
本文只是列出了一些常用数据类型的浅显的区别,在类中是否复写了equals
方法,则需要自己去查阅源码,其他的具体实现方法,需要查看jdk文档或者查阅源码。