答:
A、HashMap基于Hashing原理,经过put()和get()方法存储与获取对象。
B、咱们将值传递给put()方法,它调用键对象的hashCode()方法来计算hashcode,而后找到bucket位置来存储对象。
C、获取对象时,经过键对象的equals()方法找到正确的键值对,而后返回值对象。
D、HashMap使用链表来解决碰撞问题,当发生碰撞了,对象将会储存存在链表的下一个节点。
E、HashMap在每一个链表节点中存储键值对对象。算法
散列法(Hashing)是一种将字符组成的字符换转换为固定长度的数值或索引的方法,称为散列法,也叫哈希法。
因为经过更短的哈希值比用原来的值进行数据库搜索更快,这种方法通常用在数据库中创建索引进行搜索,同时还用在各类解密算法中。数据库
答:HashMap及其子类,采用Hash算法来决定集合中元素的存储位置。当系统开始初始化HashMap时,系统会建立一个长度为capacity的Entry数组。
这个数组里能够存储元素的位置被称为bucket(桶)。每一个bucket都有指定索引,系统能够根据其索引快速访问该bucket里存储的元素。
HashMap的每一个bucket(桶)只存储一个元素Entry,因为Entry对象能够包含一个引用变量,也就是Entry指向另外一个Entry依次类推,就造成了一个链。数组
答:当HashMap的每一个bucket里面只存储一个Entry,也就是没有经过指针产生Entry链时,此时HashMap具备最好的性能。
当程序取出对应的value时,系统只要先计算出key的hashcode返回值,根据hashode返回值找到该key在table数组中的索引,而后取出索引处的Entry,返回给能够对应的value便可。安全
public V get(Object key) { // 若是 key 是 null,调用 getForNullKey 取出对应的 value if (key == null) return getForNullKey(); // 根据该 key 的 hashCode 值计算它的 hash 码 int hash = hash(key.hashCode()); // 直接取出 table 数组中指定索引处的值, for (Entry<K,V> e = table[indexFor(hash, table.length)]; e != null; e = e.next){ Object k; // 若是该 Entry 的 key 与被搜索 key 相同 if (e.hash == hash && ((k = e.key) == key || key.equals(k))) return e.value; } return null; }
若是HashMap的每一个桶里只有一个Entry时,HashMap能够根据索引快速的取出桶里的Entry。
在碰撞问题下,单个桶里存储的不是一个Entry,而是一个Entry链,系统只有按顺序遍历每一个Entry,知道找到目标Entry为止。
HashMap在底层将key-value做为一个总体,进行处理。这个总体就是Entry对象。HashMap底层采用一个Entry[]数组来保存全部的key-value。
当须要存储一个Entry对象时,会根据Hash算法来决定其存储位置;
先判断该位置上有没有Entry,没有的话就建立一个Entry对象,再在这个位置上插入;
若是有Entry的话,经过链表的遍历方式去逐个遍历,经过Equals方法将key和已有的key进行比较,看看有没有已经存在的key,有的话用新的value替换以前的value;若是没有则在table[i]插入该Entry,把原来的table[i]位置上的Entry赋值给新的Entry的next。因此新的Entry插入的位置永远是链表的最前面。
当须要取出一个Entry对象时,会根据Hash算法找到其存储位置,直接取出Entry。数据结构
答:会储存在同一个bucket位置的链表中。键对象的equals()方法用来找到键值对。ide
答:哈希表(HashTable)又叫作散列表,是根据关键码值(即键值对)而直接访问的数据结构。也就是说,它经过把关键码映射到表中一个位置来访问记录,以加快查找速度性能
答:一、继承的父类不一样
Hashtable继承自Dictionary类,而HashMap继承自AbstractMap类。但两者都实现了Map接口。
二、线程安全性不一样
hashmap:此实现不是同步的。若是多个线程同时访问一个哈希映射,而其中至少一个线程从结构上修改了该映射,则它必须保持外部同步。
HashMap和Hashtable都实现了Map接口,但决定用哪个以前先要弄清楚它们之间的分别。主要的区别有:线程安全性,同步(synchronization),以及速度。
HashMap几乎能够等价于Hashtable,除了HashMap是非synchronized的,并能够接受null(HashMap能够接受为null的键值(key)和值(value),而Hashtable则不行)。
HashMap是非synchronized,而Hashtable是synchronized,这意味着Hashtable是线程安全的,多个线程能够共享一个Hashtable;而若是没有正确的同步的话,多个线程是不能共享HashMap的。
HashMap不能保证随着时间的推移Map中的元素次序是不变的。
三、key和value是否容许null值
Hashtable中,key和value都不容许出现null值。
可是若是在Hashtable中有相似put(null,null)的操做,编译一样能够经过,由于key和value都是Object类型,但运行时会抛出NullPointerException异常,这是JDK的规范规定的。
HashMap中,null能够做为键,这样的键只有一个;能够有一个或多个键所对应的值为null。
当get()方法返回null值时,多是 HashMap中没有该键,也可能使该键所对应的值为null。所以,在HashMap中不能由get()方法来判断HashMap中是否存在某个键, 而应该用containsKey()方法来判断。线程
HashSet实现了Set接口,它不容许集合中有重复的值,当咱们提到HashSet时,第一件事情就是在将对象存储在HashSet以前,要先确保对象重写equals()和hashCode()方法,这样才能比较对象的值是否相等,以确保set中没有储存相等的对象。若是咱们没有重写这两个方法,将会使用这个方法的默认实现。public boolean add(Object o)方法用来在Set中添加元素,当元素值重复时则会当即返回false,若是成功添加的话会返回true。指针