大致看了一下代码,你这个可是把所有的sheet都遍历完把数据放入map里哦。
你的代码是弄了两个for循环,第一次是循环第一列,第二次循环第二列。
既然你是要放入map,干嘛去弄两个list一个放key,一个放value,然后在遍历这两个list把数据分别置为map的key和value呢?这样是不是有点多余呀?
建议你改成双重for循环,一次就可以将数据放入map了。
如果没明白,我再给你写代码。
HashMap是对数据结构中哈希表(Hash
Table)的实现,Hash表又叫散列表。Hash表是根据关键码Key来访问其对应的值Value的数据结构,它通过一个映射函数把关键码映射到表中一个位置来访问该位置的值,从而加快查找的速度。这个映射函数叫做Hash函数,存放记录的数组叫做Hash表。
在Java中,HashMap的内部实现结合了链表和数组的优势,链接节点的数据结构是Entry<k,v>,每个Entry对象的内部又含有指向下一个Entry类型对象的引用,如以下代码所示:
static
class
Entry<K,V>
implements
MapEntry<K,V>
{
final
K
key;
V
value;
Entry<K,V>
next;
//Entry类型内部有一个自己类型的引用,指向下一个Entry
final
int
hash;
}
在HashMap的构造函数中可以看到,Entry表被申明为了数组,如以下代码所示:
public
HashMap()
{
thisloadFactor
=
DEFAULT_LOAD_FACTOR;
threshold
=
(int)(DEFAULT_INITIAL_CAPACITY
DEFAULT_LOAD_FACTOR);
table
=
new
Entry[DEFAULT_INITIAL_CAPACITY];
init();
}
在以上构造函数中,默认的DEFAULT_INITIAL_CAPACITY值为16,DEFAULT_LOAD_FACTOR的值为075。
当put一个元素到HashMap中去时,其内部实现如下:
public
V
put(K
key,
V
value)
{
if
(key
==
null)
return
putForNullKey(value);
int
hash
=
hash(keyhashCode());
int
i
=
indexFor(hash,
tablelength);
}
HashMap是基于哈希表的Map接口的非同步实现。实现HashMap对数据的 *** 作,允许有一个null键,多个null值。
HashMap底层就是一个数组结构,数组中的每一项又是一个链表。数组+链表结构,新建一个HashMap的时候,就会初始化一个数组。Entry就是数组中的元素,每个Entry其实就是一个key-value的键值对,它持有一个指向下一个元素的引用,这就构成了链表,HashMap底层将key-value当成一个整体来处理,这个整体就是一个Entry对象。HashMap底层采用一个Entry数组来保存所有的key-value键值对,当需要存储一个Entry对象时,会根据hash算法来决定在其数组中的位置,在根据equals方法决定其在该数组位置上的链表中的存储位置;当需要取出一个Entry对象时,也会根据hash算法找到其在数组中的存储位置, 在根据equals方法从该位置上的链表中取出Entry;
put: (key-value)方法是HashMap中最重要的方法,使用HashMap最主要使用的就是put,get两个方法。
判断键值对数组table[i]是否为空或者为null,否则执行resize()进行扩容;
根据键值key计算hash值得到插入的数组索引 i ,如果table[i] == null ,直接新建节点添加即可,转入6,如果table[i] 不为空,则转向3;
判断table[i] 的首个元素是否和key一样,如果相同(hashCode和equals)直接覆盖value,否则转向4;
判断table[i] 是否为treeNode,即table[i]是否为红黑树,如果是红黑树,则直接插入键值对,否则转向5;
遍历table[i] , 判断链表长度是否大于8,大于8的话把链表转换成红黑树 ,进行插入 *** 作,否则进行链表插入 *** 作;便利时遇到相同key直接覆盖value;
插入成功后,判断实际存在的键值对数量size是否超过了threshold,如果超过,则扩容;
也可参考HashSetput过程:
>
HashMap,基于哈希表的Map接口的实现。此实现提供所有可选的映射 *** 作,并允许使用null值和null键。(除了非同步和允许使用null之外,HashMap类与Hashtable大致相同。)此类不保证映射的顺序,特别是它不保证该顺序恒久不变。此实现假定哈希函数将元素适当地分布在各桶之间,可为基本 *** 作(get和put)提供稳定的性能。迭代collection视图所需的时间与HashMap实例的"容量"(桶的数量)及其大小(键-值映射关系数)成比例。所以,如果迭代性能很重要,则不要将初始容量设置得太高(或将加载因子设置得太低)。Hashtable,类实现一个哈希表,该哈希表将键映射到相应的值。任何非null对象都可以用作键或值。为了成功地在哈希表中存储和获取对象,用作键的对象必须实现hashCode方法和equals方法。
以上就是关于java poi 读取excel数据 存入hashMap中全部的内容,包括:java poi 读取excel数据 存入hashMap中、hashmap 中 hash 函数怎么是是实现的还有哪些 hash 的实现方式、Map集合:HashMap、TreeMap等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)