Java 初学者:深度辨析 "==" 与 equals() 方法的区别
1. 基本数据类型当中,"==" 比较的是两个变量的值
- int a=5;
- int b=4;
- int c=5;
- System.out.println(a==b);//false
- System.out.println(a==c);//true
2. 引用数据类型当中,"==" 比较的是两个对象在内存里是不是同一个对象,就是说在内存里的存储位置(地址,引用)是否一致。(这里拿 String 举例)
- 1 String str1 = new String("Hello");
- 2 String str2 = new String("Hello");
- 3 String str3 = new String("World");
- 4 System.out.println(str1 == str2);// false,new出来的对象在堆当中,属于两个对象
- 5 System.out.println(str1 == str3);// false,同上
3. 两个 String 对象的存储值是一样的,但有可能在内存里存储在不同的地方。
- String str1 = "Hello";
- String str2 = "Hello";
- String str3 = new String("Hello"); //对String对象进行==比较
- System.out.println(str1 == str2); //true,str1和str2在方法区的常量池当中,属于同一个引用
- System.out.println(str1 == str3); //false,str3在堆当中,与str1存储位置不一致
- System.out.println(str2 == str3); //false,同上
4."==" 比较的是引用(内存里的存储位置), 而 String 类中 equals() 方法比较的是字符串的内容。
- String str1 = "Hello";
- String str2 = "Hello";
- String str3 = "World";
- String str4 = new String("Hello");
- String str5 = new String("World");
- System.out.println(str1.equals(str2)); //true,内容相同
- System.out.println(str1.equals(str3)); //false,内容不同
- System.out.println(str1.equals(str4)); //true,内容相同
- System.out.println(str1.equals(str5)); //false,内容不同
5.public boolean equals(Object obj)这个方法是由 Object 对象提供的,可以由子类进行重写。
默认的实现只有当对象和自身进行比较时才会返回 true,这个时候和 "==" 是等价的。下面是 Object 类下的 equals() 方法:
- public boolean equals(Object obj) {
- return (this == obj);
- }
而 String 类继承至 Object 类,对 equals() 方法进行了方法重写,下面是 String 类下的 equals 方法():
- public boolean equals(Object anObject) {
- if (this == anObject) {
- return true; //同一个引用,说明是同一对象,字符序列内容一定相同
- }
- if (anObject instanceof String) { //判断是不是String对象
- String anotherString = (String) anObject; //下转型,转换为String字符串
- 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,BitSet,Date,和 File 都对 equals 方法进行了重写,对两个 String 对象而言,值相等意味着它们包含同样的字符序列,对于基本类型的包装类来说;值相等意味着对应的基本类型的值一样。
7. 总结:
(1)."==" 如果比较的是对象是基本数据类型,则比较的是值是否相等;"==" 如果比较的对象是引用数据类型,则比较的是引用,即比较在内存当中的存储位置(地址)是否相同,也可以理解为是否是同一个对象(a is a)。
(2).equals() 方法默认比较的是是否为同一对象(子类没有重写父类 equals 方法),String 类的 equals() 方法比较的是内容(该类对 equals() 方法进行了重写,即 a like a)是否相同,自定义类也可重写 equals()方法,这里不在赘述。
来源: http://www.cnblogs.com/ixan/p/7355620.html