1. HashMap 工作原理
基于hashing原理,通过put()和get()方法存取对象。
当将k-v传递给put()时,它调用key对象的hashcode()来计算hashcode,然后找到bucket位置来存储对象。获取对象时,通过key对象的equals()找到正确的k-v,然后返回值对象。
HashMap使用链地址法来解决碰撞问题,当发生碰撞时,对象将存储在链表的下一节点中,(HashMap在每个链表节点中存储k-v对象)。
当两个不同的key对象的hashcode相同时,它们会存储在同一个bucket位置的链表中,key对象的equals()用来找到k-v。
2. HashMap与HashSet的区别
实现接口 | 存储 | 插入元素 | 速度 | 计算hashcode值 | |
HashMap | Map | k-v | put() | 较快(使用唯一的key来获取对象) | 使用key对象 |
HashSet | Set | (仅仅存储)对象 | add() | 比较慢 | 使用成员对象(若hashcode相同,则使用equals()来判断对象的相等性) |
3. HashMap与TreeMap的区别
实现 | 存储 | 遍历 | k-v | 安全性 | 效率 | |
HashMap | hash表(AbstractMap) | 无序的 | 随机的 | key,value可以为null | 非并发安全 | 高 |
TreeMap | SortMap接口,基于红黑树 | 默认按键的升序 | 排序的 | 不允许为null | 非并发安全 | 低 |
4. HashSet与TreeSet的区别
实现 | 存储 | 增删复杂度 | k-v | 效率 | 怎么区分重复数据 | |
HashSet | hash表 | 无序,不重复 | o(1) | 能且只能放入一个null | 快(通常使用) | 依靠Comparable |
TreeSet | 树形结构 | 有序,不重复 | o(logn) | 不允许放入null | 慢 | 依靠hashcode(),equals() |
5. HashMap与HashTable的区别
1. 二者都实现了map、cloneable、serializable 接口,但HashMap继承自AbstractMAP类,而HashTable继承自Dictionary类(已废弃)。
2. HashMap允许键key和value为null;而HashTable则不允许key或value为null;在HashMap中,null可以作为键,但这样的key只有一个,当get()方法返回null时,可能是没有该key,也可能是该key所对应的值为null,所以不能由get() 来判断HashMap中是否存在某个key,而应用containkey()来判断。
3. HashMap非同步(线程不安全),适合于单线程,但效率很快;HashTable 是线程安全的,适合于多线程,但由于效率低,现在已基本废弃。
4. 初始容量大小和每次扩容大小不同。
初始容量 扩充容量 HashMap 16 2n HashTable 11 2n+1 5. 两者都提供了可迭代的键的集合,HashTable还提供了键的枚举。
6. hash 值的计算方法不同,HashTable用的是obj的hashcode()。
7. HashMap 不能保证随着时间的推移,map中的元素次序是不变的。
11