问题二:为什么结果不一样?又点乱了 equals的源代码: public boolean equals(Object obj){ return (this==obj); } 那么s1.equals(s2)的返回值不就是 (s1==s2) 吗? 但是s1.equals(s2);结果为true s1==s2; 结果为false 问题三: class Student{ public String name; public Student(String name){ this.name=name } } Student stu1=new Student("hck"); Student stu2=new Student("hck"); stu1.equals(stu2);结果为false stu1.equals(stu2)的返回值是(stu1==stu2) 相当于比较地址啊!的却是false 我想问stu1的String name="hck",这个"hck"存在常量池中,它和String s=new String("hck")有什么区别! String s1=new String("abc"); String s2=new String("abc"); s1.equals(s2);结果为true Student stu1=new Student("hck"); Student stu2=new Student("hck"); stu1.equals(stu2);结果为false 结果不一样! 在Java编程语言中,`equals()`方法是用来比较两个对象的内容是否相等的,而`==`操作符则是用来比较两个变量是否引用同一个对象。这里我们将深入探讨`equals()`方法的用法,以及它与`==`的区别,同时解决题目中提出的问题。 **问题一:** 在Java中,`String`类的实例有两种创建方式。一种是直接通过字面量,如`String s1 = "abc";`,这时字符串会直接存储在常量池中。另一种是通过`new String("abc")`,这会在堆内存中创建一个新的`String`对象。当使用`new`关键字时,即使字面量相同,也会创建两个不同的对象,因此`s1`和`s2`的引用地址是不同的。 但当我们调用`s1.equals(s2)`时,由于`String`类已经重写了`equals()`方法,比较的是字符串的内容,所以`s1.equals(s2)`的结果是`true`,因为它们的内容("abc")相同。而`s1 == s2`比较的是对象的引用,两者指向不同的内存地址,因此结果是`false`。 **问题二:** `equals()`方法的源码通常如下所示: ```java public boolean equals(Object obj) { return (this == obj); } ``` 这是Object类中的默认实现,比较的是对象的引用。但在`String`类中,`equals()`被重写为比较字符串的内容: ```java 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; } ``` 因此,对于`s1.equals(s2)`,它会比较`s1`和`s2`的内容,而不是它们的引用,所以结果是`true`。 **问题三:** 在自定义类`Student`中,没有重写`equals()`方法,所以默认使用的是`Object`类的`equals()`。这意味着`stu1.equals(stu2)`将比较`stu1`和`stu2`的引用地址,而不是`Student`对象的属性。由于`stu1`和`stu2`是两个独立的对象,它们的引用地址不同,所以`stu1.equals(stu2)`的结果是`false`。 至于`String name="hck"`和`String s=new String("hck")`的区别,前者是在常量池中创建或查找已存在的"**hck**",而后者除了在常量池查找外,还会在堆内存中创建一个新的`String`对象。所以,尽管它们的内容相同,但它们是两个不同的对象。 总结一下,`equals()`方法在`String`类中用于比较字符串内容,而在自定义类中如果不重写,它默认比较的是对象的引用。`==`操作符始终比较对象的引用,无论对象类型如何。因此,在涉及到自定义类比较时,如果需要比较对象的属性,应该重写`equals()`方法,并确保满足对象的相等性原则。
- 粉丝: 1
- 资源: 13
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助