使用lombok的实体类的equals方法是怎么被调用的?

维所欲为 2020-10-26 10:01:32
import lombok.AllArgsConstructor;
import lombok.Data;

@Data
@AllArgsConstructor
public class StreamName {
private String app;
private String name;

@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
StreamName other = (StreamName) obj;
if (app == null) {
if (other.app != null)
return false;
} else if (!app.equals(other.app))
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}

@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((app == null) ? 0 : app.hashCode());
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}

}

这个实体类中的equals方法没有任何显示的调用,甚至把equals方法注释掉了也没有任何的编译错误,但是在debug是这个方法竟然被调用了,而且注释掉后程序竟然无法正确的运行,简直看不懂了,请各位大神赐教
...全文
567 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
冰思雨 2020-10-27
  • 打赏
  • 举报
回复
引用 3 楼 维所欲为 的回复:
引用 1 楼 冰思雨 的回复:
那个StreamName类中的hashCode和equals会被自动调用吗?为什么会自动调用呢?
你要去学习和了解一下哈希算法了,这个是实现算法所必须的。如果哈希算法你觉得很困难,那就直接看看HashMap的数据结构,了解HashMap是怎样存储key-value键值对的,怎样进行查找和取得value值的,为什么它的查找速度比链表快?如果了解上述的这些内容,你就明白为什么要自动调用 hashCode和equals了。 推荐链接 https://blog.csdn.net/woshimaxiao1/article/details/83661464
维所欲为 2020-10-27
  • 打赏
  • 举报
回复
引用 4 楼 冰思雨 的回复:
引用 3 楼 维所欲为 的回复:
[quote=引用 1 楼 冰思雨 的回复:] 那个StreamName类中的hashCode和equals会被自动调用吗?为什么会自动调用呢?
你要去学习和了解一下哈希算法了,这个是实现算法所必须的。如果哈希算法你觉得很困难,那就直接看看HashMap的数据结构,了解HashMap是怎样存储key-value键值对的,怎样进行查找和取得value值的,为什么它的查找速度比链表快?如果了解上述的这些内容,你就明白为什么要自动调用 hashCode和equals了。 推荐链接 https://blog.csdn.net/woshimaxiao1/article/details/83661464[/quote] 谢谢大神的帮助!
维所欲为 2020-10-26
  • 打赏
  • 举报
回复
引用 1 楼 冰思雨 的回复:
你的代码块里面是不是有使用 HashSet 或者 HashMap 当 key 来使用? 哈希算法中,处理调用 hashCode 函数以外,当 hashCode 值相同时还会调用 equals 方法进行进一步的比较。 其他的地方也会有被调用的可能,比如,在一个集合中,你调用 contains 函数时,底层会调用 equals 函数进行比较。
大神你好,感谢您的回答,看了您的回答,我好像我点眉目了,在使用这个实体类的代码中确实是有类似于HashSet和map之类的把该实体类当作key使用,如下代码所示
public class StreamManager {
	private ConcurrentHashMap<StreamName, Stream> streams=new ConcurrentHashMap<>();
	
	public void newStream(StreamName streamName,Stream s) {
		streams.put(streamName, s);
	}
	
	public boolean exist(StreamName streamName) {
		return streams.containsKey(streamName);
	}
	
	public Stream getStream(StreamName streamName) {
		return streams.get(streamName);
	}
	
	public void remove(StreamName streamName) {
		streams.remove(streamName);
	}
}
您的意思是说这样的话会导致该实体类,也就是那个StreamName类中的hashCode和equals会被自动调用吗?为什么会自动调用呢?
维所欲为 2020-10-26
  • 打赏
  • 举报
回复
大神你好,感谢您的回答,看了您的回答,我好像我点眉目了,在使用这个实体类的代码中确实是有类似于HashSet和map之类的把该实体类当作key使用,如下代码所示:
public class StreamManager {
	private ConcurrentHashMap<StreamName, Stream> streams=new ConcurrentHashMap<>();
	
	public void newStream(StreamName streamName,Stream s) {
		streams.put(streamName, s);
	}
	
	public boolean exist(StreamName streamName) {
		return streams.containsKey(streamName);
	}
	
	public Stream getStream(StreamName streamName) {
		return streams.get(streamName);
	}
	
	public void remove(StreamName streamName) {
		streams.remove(streamName);
	}
}
您的意思是说这样的话会导致该实体类,也就是那个StreamName类中的hashCode和equals会被自动调用吗?为什么会自动调用呢?
冰思雨 2020-10-26
  • 打赏
  • 举报
回复
你的代码块里面是不是有使用 HashSet 或者 HashMap 当 key 来使用? 哈希算法中,处理调用 hashCode 函数以外,当 hashCode 值相同时还会调用 equals 方法进行进一步的比较。 其他的地方也会有被调用的可能,比如,在一个集合中,你调用 contains 函数时,底层会调用 equals 函数进行比较。

50,530

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧