关于equals和==

来源:4-4 链表的遍历,查询和修改

凌子祺

2020-02-24

老师我想问下,在这里
您用的啥 cur.e.equals(e)
这里的e是我们传入的任意object。所以您用的是equals,比较他们在内存中的地址是否一样的对吗。

但是我想问比如我新建Integer类型的单项链表,举个例子1->2->3->4->5.
我想判断这个链表是否包含数字3,如果按照您的代码里的方法进行比对,数字3是一个常数,应该不会是和链表里的3同样内存地址。这种情况要怎么办呢。

写回答

2回答

liuyubobobo

2020-02-25

@qq_慕斯卡9351403 回答的完全正确。


如果你的链表存储的元素类型是 Integer,传入 int,int 会转化成包装类 Integer 用 equals 进行比较,这本身就是包装类的意义。


此时 equals 比较的不是地址,而是值,这是因为 Integer 自己有自己定义的 equals,这也是使用 equals 这个函数,而不是使用 == 的意义。因为 equals 是一个函数,所以各个类可以根据自己的定义,去覆盖这个函数,表达自己的类中,什么叫 equals。而在我们的链表类中,只需要调用这个定义就好了。


继续加油!:)

0
1
凌子祺
非常感谢!
2020-02-27
共1条回复

qq_慕斯卡9351403

2020-02-24

你新建的Integer是基本类型int的包装类,他继承了Object类,也重写了Object的equals方法,只要你传入的是基本类型的包装类而不是基本类型,用equals是没有问题的,如果你传入的是自己封装的对象那就要重写equals方法和hashcode方法(强调一点Object的equals方法如果不重写就是==)

1
0

玩转数据结构

动态数组/栈/队列/链表/BST/堆/线段树/Trie/并查集/AVL/红黑树…

6221 学习 · 1704 问题

查看课程