1.Java中==和equals和hashCode的区别
每个Java对象都有equals方法和hashcode方法。
(1)==可用于基本数据类型做比较,基本数据类型包括int、byte、short、long类型;==如果用于类的比较就是比较两个对象的地址是否相等。
(2)equals用于类和对象的数值进行比较;
(3)hashcode:是Object的一个方法,JVM每new一个对象就会生成一个hashcode值。hashcode生成的规则一种简单的算法来实现,不同对象的hashcode值有可能会相同。hashcode对对象操作有着很重要的作用,他关系到HashMap、HashTable这两个重要的数据结构的存取速度等性能问题。
如果两个对象equals,Java
运行时环境会认为他们的hashcode
一定相等。
如果两个对象不equals
,他们的hashcode
有可能相等。
如果两个对象hashcode
相等,他们不一定equals
。
如果两个对象hashcode
不相等,他们一定不equals
。
2.HashMap、HashSet和HashTable的区别
(1)计算hash值的方法不同
HashMap:使用位运算,将哈希表的大小固定为了2的幂,这样在取模预算时,不需要做除法,只需要做位运算。位运算比除法的效率要高很多。为了解决这个问题,HashMap重新根据hashcode计算hash值后,又对hash值做了一些运算来打散数据。使得取得的位置更加分散,从而减少了hash冲突。当然了,为了高效,HashMap只做了一些简单的位处理。从而不至于把使用2 的幂次方带来的效率提升给抵消掉。
HashTable:在存取数据时,是根据hashcode来计算index进行存储数据的。计算index=(HashCode&&0x7FFFFFFF)%hashtable.length,如果有index相等的情况就得做hash冲突计算,将index计算相等的值都放在同一个key下面,用链表俩进行存储,所以需用key来做映射才能得到唯一的值。
(2)线程操作不同
HashMap:线程不安全
HashTable:线程安全,Hashtable的方法几乎都是被synchronized关键字修饰的。但是,当我们需要HashMap是线程安全的时,怎么办呢?我们可以通过Collections.synchronizedMap(hashMap)来进行处理,亦或者我们使用线程安全的ConcurrentHashMap。ConcurrentHashMap虽然也是线程安全的,但是它的效率比Hashtable要高好多倍。因为ConcurrentHashMap使用了分段锁,并不对整个数据进行锁定。
(3)存在键值对的限制不同
HashMap的key-value支持key-value,null-null,key-null,null-value四种。而Hashtable只支持key-value一种(即
key和value都不为null这种形式)。既然HashMap支持带有null的形式,那么在HashMap中不能由get()方法来判断
HashMap中是否存在某个键, 而应该用containsKey()方法来判断,因为使用get的时候,当返回null时,你无法判断到底
是不存在这个key,还是这个key就是null,还是key存在但value是null。
参考文章:
https://blog.csdn.net/luojishan1/article/details/81952147