因为在上一节老师已经在student类里重写了equals方法,所以后面能用
equals比较的是内容,==比较的是内存地址,所以用equals
已解决,可以这样直接写,去掉判断Id相同的代码就可以了。
要下载
course2是new得到的,和course的内存地址不同了,contains用equals比较的,所以会返回false吧(新手理解,仅供参考)
List集合里吧
厉害了,谢谢总结
第三行代码那有个+,你点一下就可以看见import java.util.Scanner了
第一个问题:空对象不能调用equals()方法;会抛出空指针异常; 第二个问题:值为null的引用类型变量不能调用非静态方法,会抛出空指针异常; 第三个问题:return后直接会结束函数,同时返回一个返回值;你前面不管怎么执行,最后都会得到一个return语句,所以最后的return语句就多余了; 第四个问题:是执行重写之前的方法。
比较的是对象的地址
==在不比较基本类型的时候,比较的是其引用,即地址
instance of是判断一个对象是否为一个类的实例
你这样想,equals是方法,方法要由对象调用,那么this指的就是调用这个equals方法的对象,也就是所谓的当前对象
这本来就是很基础的入门,是你自己太水,又不愿意多练,只知道怪别人
区别:
“==” 比较的是两个引用在内存中指向的是不是同一对象(即同一内存空间),也就是说在内存空间中的存储位置是否一致。
如果两个对象的引用相同时(指向同一对象时),“==”操作符返回true,否则返回flase。
注:如果有对内存分配及变量存储位置(堆、栈、方法区常量池、方法区静态区)感兴趣的可以去看看这篇博客,里面写的很详细。对我还在学基础的人来说帮助很大,理解了很多内容,还有待消化。
equals方法是由Object类提供的,可以由子类来进行重写
Object类默认的实现如下:
1 public boolean equals(Object obj) {2 3 return (this == obj);4 5 }
默认的实现只有当对象和自身进行比较时才会返回true, 这个时候和 “==”是等价的。
Java中很多类(String类 Date类 File类)等都对equals方法进行了重写,这里拿常见的String类举例。
1 public class Test { 2 public static void main(String[] args) { 3 String str1 = "abc"; 4 String str2 = "abc"; 5 System.out.println(str1==str2);//true 6 7 8 String str3 = new String("abc"); 9 String str4 = new String ("abc");10 System.out.println(str3==str4);//false11 System.out.println(str3.equals(str4));//true12 }13 }
上例中第5行,我们看到str1 == str2 的结果是true
分析原因:
先看第3行代码,先在栈中创建一个对 String类的对象引用变量str1,然后通过引用去字符串常量池 里找有没有"abc",如果没有,则将"abc"存放进字符串常量池。这里常量池中并没有“abc”。即在编译期已经创建好(直接用双引号定义的)“abc”,存储在了常量池中。(如果有对常量池不理解的可以看看我上面推荐的博客)
第4行代码又创建了对String类的对象引用str2,然后通过引用去字符串常量池 里找有没有"abc",如果没有,则将"abc"存放进字符串常量池 ,并令str2指向”abc”,如果已经有”abc” 则直接令str2指向“abc”。这里我们在第三行代码中已经将“abc”这个字符串存储进了常量池。所以str2和str1指向的是同一个“abc”,返回true。
第8行和第9行代码分别创建了2个对象,str3和str4指向的是不同的对象,即上面所说的内存空间中存储位置不同。故str3 == str4 返回的肯定是false。
第11行代码 str3.equals(str4) 返回true
因为String类重写了equals方法,比较的是内存空间存放的数据是否相同。这里存放的都是字符串“abc” 故返回true。
总结:
Java 语言里的 equals方法其实是交给开发者去覆写的,让开发者自己去定义满足什么条件的两个Object是equal的。
所以我们不能单纯的说equals到底比较的是什么。你想知道一个类的equals方法是什么意思就是要去看定义。(以上是来自知乎用户的回答)
我们要理解的是equals存在的目的。
人以能之,己百之,人十能之,己千之.果能此道也,虽愚必明,虽柔必强!
我这是第二遍看,清晰了许多.你也可以尝试多看即几遍.
我第一次学自己理解哈,这行代码相当于new了一个List的对象,下面使用它的时候可以储存和调用它的方法
对比了一下我们的代码,感觉没什么大的差别,求教我写的这个为什么报错了呢?
c不是为空的啊?
首先要明白List中contains方法实现原理是,遍历每个List中的元素(Course),调用这些元素(Course)的equals方法和入参的对象进行比较,如果有一个返回真则这个contains方法返回真。
那么你只需要在Course中重写equals方法即可,因为contains这个方法原理就是调用每一个元素(Course)的equals方法,所以在SetTest中不用做修改
没什么区别啊,可以写下运行,发现结果还是true
此时此刻,你的obj是类型是Object(因为你equals的方法中传递过来的是一个Object),你使用了instanceof只是用来判断你的obj是不是Course的一个实例,但obj本身自己还是一个Object类型。如果你不进行一次强转,那么obj就无法访问到Course的成员变量和方法,那接下来的course.name这种代码编译器都会自动报错!所以一定要进行一次强转,obj才会真正变成Course
contains中用的是Course类中继承父类的equals方法,比较的是地址。course2是新new的对象,它开辟了新的地址,并没有add到list中。而course是从list中get出来的,它的地址本来就在list中。
我也很疑惑,这节equals重写,这几个if语句我是云里雾里。回答完毕请采纳!