Ⅰ hashmap是以什么方式存储数据 arraylist又是以什么方式存储数据
hashmap 就是表,说通俗点就是一个可以理解为 两列多行 的表格,第一列中存储索引或者起标示作用的对象,第二列存储我们实际要用的对象,当我们需要第二列中某个对象时,就去找这个对象的索引(就是对应它的第一列的对象),arraylist 内部是以数组来储存数据的,它是一个“长度可变”的数组
Ⅱ Java hashmap这种存储方式是不是要耗费很大的空间啊
那是的,,,,,虽然使用方便了,所以一般能不用就不用。。。。。
Ⅲ Java中的HashMap的工作原理是什么
一,存储方式: Java中的HashMap是以键值对(key-value)的形式存储元素的。
二,调用原理: HashMap需要一个hash函数,它使用hashCode()和equals()方法来向集合/从集合添加和检索元素。当调用put()方法的时候,HashMap会计算key的hash值,然后把键值对存储在集合中合适的索引上。如果key已经存在了,value会被更新成新值。
三,其他热性: HashMap的一些重要的特性是它的容量(capacity),负载因子(load factor)和扩容极限(threshold resizing)。
Ⅳ hashmap会问到数组索引,hash碰撞怎么解决
Java中HashMap是利用“拉链法”处理HashCode的碰撞问题。在调用HashMap的put方法或get方法时,都会首先调用hashcode方法,去查找相关的key,当有冲突时,再调用equals方法。hashMap基于hasing原理,我们通过put和get方法存取对象。当我们将键值对传递给put方法时,他调用键对象的hashCode()方法来计算hashCode,然后找到bucket(哈希桶)位置来存储对象。当获取对象时,通过键对象的equals()方法找到正确的键值对,然后返回值对象。HashMap使用链表来解决碰撞问题,当碰撞发生了,对象将会存储在链表的下一个节点中。hashMap在每个链表节点存储键值对对象。当两个不同的键却有相同的hashCode时,他们会存储在同一个bucket位置的链表中。键对象的equals()来找到键值对。
Ⅳ HashMap和LinkedHashMap的区别
java为数据结构中的映射定义了一个接口java.util.Map;它有四个实现类,分别是HashMap Hashtable LinkedHashMap 和TreeMap.
Map主要用于存储健值对,根据键得到值,因此不允许键重复(重复了覆盖了),但允许值重复。
Hashmap 是一个最常用的Map,它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度,遍历时,取得数据的顺序是完全随机的。 HashMap最多只允许一条记录的键为Null;允许多条记录的值为 Null;HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap;可能会导致数据的不一致。如果需要同步,可以用 Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap。
Hashtable与 HashMap类似,它继承自Dictionary类,不同的是:它不允许记录的键或者值为空;它支持线程的同步,即任一时刻只有一个线程能写Hashtable,因此也导致了 Hashtable在写入时会比较慢。
LinkedHashMap 是HashMap的一个子类,保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的.也可以在构造时用带参数,按照应用次数排序。在遍历的时候会比HashMap慢,不过有种情况例外,当HashMap容量很大,实际数据较少时,遍历起来可能会比 LinkedHashMap慢,因为LinkedHashMap的遍历速度只和实际数据有关,和容量无关,而HashMap的遍历速度和他的容量有关。
TreeMap实现SortMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。
一般情况下,我们用的最多的是HashMap,在Map 中插入、删除和定位元素,HashMap 是最好的选择。但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。如果需要输出的顺序和输入的相同,那么用LinkedHashMap 可以实现,它还可以按读取顺序来排列.
HashMap是一个最常用的Map,它根据键的hashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度。HashMap最多只允许一条记录的键为NULL,允许多条记录的值为NULL。
HashMap不支持线程同步,即任一时刻可以有多个线程同时写HashMap,可能会导致数据的不一致性。如果需要同步,可以用Collections的synchronizedMap方法使HashMap具有同步的能力。
Hashtable与HashMap类似,不同的是:它不允许记录的键或者值为空;它支持线程的同步,即任一时刻只有一个线程能写Hashtable,因此也导致了Hashtable在写入时会比较慢。
LinkedHashMap保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的。
在遍历的时候会比HashMap慢TreeMap能够把它保存的记录根据键排序,默认是按升序排序,也可以指定排序的比较器。当用Iterator遍历TreeMap时,得到的记录是排过序的。
Ⅵ Java中HashMap和LinkedHashMap以及TreeMap的区别
共同点:
HashMap,LinkedHashMap,TreeMap都属于Map;Map 主要用于存储键(key)值(value)对,根据键得到值,因此键不允许键重复,但允许值重复。
不同点:
1.HashMap里面存入的键值对在取出的时候是随机的,也是我们最常用的一个Map.它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度。在Map 中插入、删除和定位元素,HashMap 是最好的选择。
2.TreeMap取出来的是排序后的键值对。但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。
3. LinkedHashMap 是HashMap的一个子类,如果需要输出的顺序和输入的相同,那么用LinkedHashMap可以实现. (应用场景:购物车等需要顺序的)
Ⅶ 为什么面试要问hashmap 的原理
HashMap
的工作原理
HashMap
,都知道哪里要用
HashMap
,知道
Hashtable
和
HashMap
之间的区别
,那么
为何这道面试题如此特殊呢?是因为这道题考察的深度很深。
这题经常出现在高级或中高级
面试中。投资银行更喜欢问这个问题,甚至会要求你实现
HashMap
来考察你的编程能力。
ConcurrentHashMap
和其它同步集合的引入让这道题变得更加复杂。让我们开始探索的
旅程吧!
先来些简单的问题
“你用过
HashMap
吗?”
“什么是
HashMap
?你为什么用到它?”
几乎每个人都会回答“是的”,然后回答
HashMap
的一些特性,譬如
HashMap
可以接
受
null
键值和值,而
Hashtable
则不能;
HashMap
是非
synchronized;HashMap
很快;
以及
HashMap
储存的是键值对等等。
这显示出你已经用过
HashMap
,
而且对它相当的熟
悉。但是面试官来个急转直下,从此刻开始问出一些刁钻的问题,关于
HashMap
的更多
基础的细节。面试官可能会问出下面的问题:
“你知道
HashMap
的工作原理吗?”
“你知道
HashMap
的
get()
方法的工作原理吗?”
你也许会回答“我没有详查标准的
Java API
,你可以看看
Java
源代码或者
Open JDK
。”
“我可以用
Google
找到答案。”
但一些面试者可能可以给出答案,
“
HashMap
是基于
hashing
的原理,
我们使用
put(key,
value)
存储对象到
HashMap
中,使用
get(key)
从
HashMap
中获取对象。当我们给
put()
方法传递键和值时,
我们先对键调用
hashCode()
方法,
返回的
hashCode
用于找到
bucket
位置来储存
Entry
对象。”这里关键点在于指出,
HashMap
是在
bucket
中储存键对象和
值对象,作为
Map.Entry
。这一点有助于理解获取对象的逻辑。如果你没有意识到这一点,
或者错误的认为仅仅只在
bucket
中存储值的话,
你将不会回答如何从
HashMap
中获取对
象的逻辑。这个答案相当的正确,也显示出面试者确实知道
hashing
以及
HashMap
的工
作原理。但是这仅仅是故事的开始,当面试官加入一些
Java
程序员每天要碰到的实际场景
的时候,错误的答案频现。下个问题可能是关于
HashMap
中的碰撞探测
(collision
detection)
以及碰撞的解决方法:
“当两个对象的
hashcode
相同会发生什么?”
从这里开始,真正的困惑开始了,一些面
试者会回答因为
hashcode
相同,
所以两个对象是相等的,
HashMap
将会抛出异常,
或者
不会存储它们。然后面试官可能会提醒他们有
equals()
和
hashCode()
两个方法,并告诉他
们两个对象就算
hashcode
相同,但是它们可能并不相等。一些面试者可能就此放弃,而
另外一些还能继续挺进,他们回答“因为
hashcode
相同,所以它们的
bucket
位置相同,
‘碰撞’会发生。因为
HashMap
使用
LinkedList
存储对象,这个
Entry(
包含有键值对的
Map.Entry
对象
)
会存储在
LinkedList
中。”这个答案非常的合理,虽然有很多种处理碰撞
的方法,这种方法是最简单的,也正是
HashMap
的处理方法。但故事还没有完结,面试
官会继续问:
“如果两个键的
hashcode
相同,
你如何获取值对象?”
面试者会回答:
当我们调用
get()
方法,
HashMap
会使用键对象的
hashcode
找到
bucket
位置,然后获取值对象。面试官
提醒他如果有两个值对象储存在同一个
bucket
,
他给出答案
:
将会遍历
LinkedList
直到找到
值对象。
面试官会问因为你并没有值对象去比较,
你是如何确定确定找到值对象的?除非面
试者直到
HashMap
在
LinkedList
中存储的是键值对,否则他们不可能回答出这一题。
其中一些记得这个重要知识点的面试者会说,
找到
bucket
位置之后,
会调用
keys.equals()
方法去找到
LinkedList
中正确的节点,最终找到要找的值对象。完美的答案!
Ⅷ linkedhashmap和hashmap的区别
HashMap
是一个最常用的Map,它根据键的HashCode
值存储数据,根据键可以直接获取它的值,具有很快的访问速度。HashMap最多只允许一条记录的键为Null;允许多条记录的值为Null;HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap;可能会导致数据的不一致。如果需要同步,可以用Collections的synchronizedMap方法使HashMap具有同步的能力。
LinkedHashMap
LinkedHashMap也是一个HashMap,但是内部维持了一个双向链表,可以保持顺序
Ⅸ HashMap如何存储数据的
对key进行hash,未发生碰撞,直接存储,发生碰撞,碰撞数小于8,链表存储,大于8,红黑树存储。
参考:
飞升之路 Java学习笔记-HashMap原理
Ⅹ hashmap和linkedhashmap的区别
一般情况下,我们用的最多的是HashMap,在Map 中插入、删除和定位元素,HashMap 是最好的选择。但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。如果需要输出的顺序和输入的相同,那么用LinkedHashMap 可以实现,它还可以按读取顺序来排列.
HashMap是一个最常用的Map,它根据键的hashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度。HashMap最多只允许一条记录的键为NULL,允许多条记录的值为NULL。
HashMap不支持线程同步,即任一时刻可以有多个线程同时写HashMap,可能会导致数据的不一致性。如果需要同步,可以用Collections的synchronizedMap方法使HashMap具有同步的能力。
Hashtable与HashMap类似,不同的是:它不允许记录的键或者值为空;它支持线程的同步,即任一时刻只有一个线程能写Hashtable,因此也导致了Hashtable在写入时会比较慢。
LinkedHashMap保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的。
在遍历的时候会比HashMap慢TreeMap能够把它保存的记录根据键排序,默认是按升序排序,也可以指定排序的比较器。当用Iterator遍历TreeMap时,得到的记录是排过序的。