黑马程序员技术交流社区
标题:
关于Object中equals方法的问题
[打印本页]
作者:
╰青青子佩ˊゝ
时间:
2014-4-3 19:40
标题:
关于Object中equals方法的问题
为什么会出现下面的情况啊?
String str1 = "hello";
String str2 = new String("hello");
System.out.println(str1.equals(str2));//这里为true
int[] arr1 = {1,2,3};
int[] arr2 = {1,2,3};
System.out.println(arr1.equals(arr2));//那为什么这里为false?这不是相等的数组嘛?
Person p1 = new Person("zhangsan");
Person p2 = new Person("zhangsan");
System.out.println(p1.equals(p2));//这里也为false?
复制代码
作者:
清风有意
时间:
2014-4-3 19:50
本帖最后由 清风有意 于 2014-4-3 19:52 编辑
Object 类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true(x == y 具有值 true)。
所以只要引用不是同一个对象,那么就是false而String 类中 的equals复写了Object中的equals方法,所以String 类中的equals比较的是字符串内容是否相等。
所以在做排序的时候,需要复写Object中的equals方法,来确定输入内容的唯一性。
作者:
changchunhaha
时间:
2014-4-3 19:55
equals比较的是地址
String str1 = "hello";
String str2 = new String("hello");
System.out.println(str1.equals(str2));字符串是最特殊的,因为当创建一个“hello”后,内存中就存在“hello”。当str2建立时,是会先查看内存中是否存在“hello”。如果存在,那么它们地址值相同,所以是ture.
而数组和建立一个新的对象都是每建立一个就会有一个新的地址值。所以是flase;
作者:
2528870651
时间:
2014-4-3 20:10
本帖最后由 2528870651 于 2014-4-3 20:19 编辑
String str1 = "hello";
String str2 = new String("hello");
System.out.println(str1.equals(str2));//这里为true
int[] arr1 = {1,2,3};
int[] arr2 = {1,2,3};
System.out.println(arr1==arr2);//那为什么这里为false?这不是相等的数组嘛?
Person p1 = new Person("zhangsan");
Person p2 = new Person("zhangsan");
System.out.println(p1==p2);//这里也为false?
复制代码
刚刚试了一下 把equals()换成“==” 结果还是没变,还是“true false false”前面的true就不解释了,他是String的equals比较的是内容是否相同。而后面的2个false,说明他们的内存地址都不相同 ,更不要说equals了。object类的 equals其实是比较内存地址,而String类的equals复写了object的equals,赋予了equals新的含义
String的equals是比较的内容是否相等。
作者:
╰青青子佩ˊゝ
时间:
2014-4-3 20:19
清风有意 发表于 2014-4-3 19:50
Object 类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x 和 y,当且仅当 x ...
equals比较的是内存地址?==比较的内存地址?那equals和==怎么区别啊
作者:
郭黎明
时间:
2014-4-3 21:01
String字符串,数组, 自定义对象Persont它们都属于Object的子类,object中有equals方法,String重写了object的equals方法,所以两个字符串比较就是看它们的组成是否相同。数组和自定义对象因为没有重写object的equals方法,所以它们比较的是内存中的地址值,比较地址值两个不同的对象就不会相同
作者:
陈振宇
时间:
2014-4-3 21:20
Object类中的equals方法比较是否引用同一个类的同一个对象,如果是同一个对象的引用,则返回true,反之则为false,但是String类复写了Object类的equals方法,比较两个对象引用的字符串内容是否相等,所以疑问中的第一个输出语句虽然是两个对象引用,但是因为两个对象的字符串相同,所以返回ture,另外两个因为是两个不同的对象引用,所有返回fals。
作者:
491138002
时间:
2014-4-3 21:47
本帖最后由 491138002 于 2014-4-3 21:53 编辑
String str1 = "hello";
String str2 = new String("hello");
System.out.println(str1.equals(str2));//这里为true
这里比较的是字符串
int[] arr1 = {1,2,3};
int[] arr2 = {1,2,3};
System.out.println(arr1==arr2);//false
比较的是地址,
arr1和arr2指向不同的地址
Person p1 = new Person("zhangsan");
Person p2 = new Person("zhangsan");
System.out.println(p1==p2);// false
比较的是对象,p1和p2是两个不同的对象
作者:
张耀扬
时间:
2014-4-3 22:05
String str1 = "hello";
String str2 = new String("hello");
System.out.println(str1.equals(str2));//这里为true
int[] arr1 = {1,2,3};
int[] arr2 = {1,2,3};
System.out.println(arr1.equals(arr2));//那为什么这里为false?这不是相等的数组嘛?
Person p1 = new Person("zhangsan");
Person p2 = new Person("zhangsan");
System.out.println(p1.equals(p2));//这里也为false?
equals方法在各个类的实现的时候需要重写 ;各类实现的方法并不一样;
数组和对象里调用equals时, 比较的是数组的引用和对象引用的哈希码值, 这两组引用均指向不同的对象,所以返回false
作者:
心?=忐§忑]
时间:
2014-4-5 15:02
class Person{
String name = null;
public Person(String name){
this.name = name ;
}
}
public class demo2 {
public static void main(String args[]){
String str1 = "hello";
String str2 = new String("hello");
System.out.println(str1.equals(str2));//这里为true
//这里比较的是字符串中的内容,所以是真的
int[] arr1 = {1,2,3};
int[] arr2 = {1,2,3};
System.out.println(arr1.equals(arr2));//那为什么这里为false?这不是相等的数组嘛?
//这里虽然内容相同,但这是数组,比较的则是地址,而比较内容是相对字符串而言的
Person p1 = new Person("zhangsan");
Person p2 = new Person("zhangsan");
System.out.println(p1.equals(p2));//这里也为false?
//这里则比较的是Person类的对象地址,地址不可能一样
}
}
作者:
请备注
时间:
2014-4-5 17:05
http://bbs.itheima.com/thread-112461-1-1.html
里面说的很详细自己去看吧
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2