equlas和HashCode,equals和==
最近在查看List处理大量数据问题,论坛有人提出以下两种解决方案,感觉比较靠谱
1.将这100万条数据,通过hash分成几块小的数据,那么重复的数必然在同一个数据块内,然后在建立多个线程,每个线程处理一个数据块,先对每个数据块排序,然后二分查找。
2.因为一百万条数据比较多,可以用一个map来处理数据,键是数据,值是这个数据出现的次数,如果100万条的数据固定的话,可以考虑用bitmap但是java当中只有bitset,所以bitmap只能是自己来模拟了,然后通过map快速查找。
原网址https://bbs.csdn.net/topics/391815755
对于HashCode比较陌生,所以记录以下
首先要明确一个知识点 hashCode相等,那么equals可以不相等,但是equals相等,那么hashCode就一定相等这2个定理!这个是规范,适用于大部分应用,当然规范之外肯定有例外。
其次我们还有明白一个知识点 HashCode和equlas的关系:
(1)如果不创建“类对应的散列表的话”(就是当我们不会把一个类放到在HashSet, Hashtable, HashMap这种底层实现是以hashcode来去定位存储位置的话),如果不是这种情况下的话,此时这个类的hashcode()和equals()是没有一点关系的
(2)如果恰好用到了上面所说的“创建了类对应的散列表的话”,那么也就是你把这个类作为key来去存储其他的value的话,这种情况下是可以进行比较的
解释:
User user1=new User(); User user2=new User(); Map<User,String> map=new HashMap<User,String>(); map.put(user1,"这是user1"); map.put(user2,"这是user2"); 此时User 类中的HashCode和Equals才有发生关系。如果不是这种存储情况,他们二者没有关系
原文链接:https://blog.csdn.net/qq_36520235/article/details/84679541
如果两个对象相等,那么它们的hashCode()值一定相同。这里的相等是指,通过equals()比较两个对象时返回true。
如果两个对象hashCode()相等,它们并不一定相等。
因为在散列表中,hashCode()相等,即两个键值对的哈希值相等。然而哈希值相等,并不一定能得出键值对相等。补充说一句:“两个不同的键值对,哈希值相等”,这就是哈希冲突。(若要判断两个对象是否相等,除了要覆盖equals()之外,也要覆盖hashCode()函数。否则,equals()无效。 )
equas和==
首先要明确equals和==都是Object超类中的方法
当我们创建一个新的实体类的时候都会继承者两个方法。
在超类中equals和==是一样的都是对于对象地址的比较。
然后在实际应用中,大部分人都是在新的实体类中重写了equals()方法,用来对比对象的内容,
例如我们常用的String ,String中的equals就是被重写过的,所以当两个字符串相同时,会返回true。
最后明确一点即可 在超类Object中equals和== 一样 都是对象地址的比较,而在自己创建的实体类中,需要看是否重写equals()方法