⑴ java里map底层是通过什么实现的队列和键值有什么区别
它的实现原理有些类似于二维数组,但是新的HashMap集合,是采用异步方式来实现的,它的效率较高!老的TableMap是同步实现的的,所以现在不推荐用这个,有时间可以看看底层代码,一看就明白了,很简单的
⑵ Java中HashMap和TreeMap的区别深入理解
HashMap底层是用数组做的,TreeMap是基于树做的
这么做的结果就是HashMap的数据在不停的添加的时候效率会比较低,而对于查找的效率是比较快的,TreeMap对于添加的效率是比较高的但是对于查找的效率要相对比较低一些
这里简单从底层说一下,我就不从具体的实现上说,只从数据结构和大致的原理上来补充一下我的答案。
HashMap这个类在存储的时候,首先根据key来计算机将要存储的key-value映射对存储在数组的什么位置上,当计算出位置后就把这个映射对存储到这个位置上。当读取的时候,首先根据key来计算出一个位置来,到数组的相应的位置上去读取数据,如果没有数据,则表示此Map中不存在该映射对,若存在则直接返回。说到这里就可以解释一下为什么对于不停地存储的效率相对比较低了,首先在初始化的时候对于数组的长度给了一个初始的长度,当往这里面添加数据达到一定的程度的时候就没法继续添加数据了,继续添加数据的冲突就会增大,或者没法添加数据(这里有一个衡量的量就是装填因子,是指这个数组中的添加的数据的个数和数组长度的比值,在java中比较合理的装填因子数是0.75),当数据添加到这个程度的时候不能不让用户继续添加数据吧,总得解决继续添加数据的问题啊,于是提出了解决方案,即开一个更大的数组,把当前上的每一个数据重新在更大的数组上计算位置,并把数据复制过去,这样完成的数组的扩大,看完这个我们知道,这个过程是很耗时的,所以说对于不停的存储数据时效率是比较低的。这里有没有一个稍微好一点的解决方案或者说不需要进行数组的扩大吗,我们能不能一开始在初始化的时候就把数组的空间开辟的足够大,这样就不用在存储的过程进行复制了,可以吗,答案是肯定的,java给我们提供了这个在初始化的时候的方式。但是,也是有问题的那就是我们的数据不够多,就会造成空间的浪费。有没有一个速度即快又不浪费空间的方式呢,解决方案也有一个,那就是在开始的时候我们就能很好的预测数据的规模,这样我们在开始的时候按照相应的规模进行初始化,这样就很好了,实际中我们是不能很好的预测这个规模的。于是对于这种情况提出了下一个解决方案TreeMap。
TreeMap是一个基于树的存储结构,学过数据结构的应该知道,树的实现方式是基于指针实现的,在Java中是用引用模拟实现的,这里大家都知道,其实树的读取效率并不低,这里是相对于数组的顺序查找来说的,但是与HashMap的查找方式相比就有了差距,HashMap是上来先问你在哪,直接就去取数据了,TreeMap需要遍历,也就是需要挨个询问你是我要的东西吗,对比一下,是就返回,不是就继续查找,于是查找的效率就低了,但是它解决了HashMap数组扩大的时候的效率问题,就是新添加的数据可以往里面添加,不会出现复制的情况,这里就是由于模拟的指针的缘故实现的。
其实从总体来说这两个各有利弊,我们在使用的时候需要根据实际的需要来选择相应的类。
⑶ 2020-01-17:java中,HashMap底层数据结构是什么
HashMap的数据结构为:数组+(链表或红黑树)
hashmap的数据结构
为什么采用这种结构来存储元素呢?
数组的特点:查询效率高,插入,删除效率低。
链表的特点:查询效率低,插入删除效率高。
在HashMap底层使用数组加(链表或红黑树)的结构完美的解决了数组和链表的问题,使得查询和插入,删除的效率都很高~
⑷ JAVA中的HASHSET和HASHMap的底层实现是怎样的大致讲一下。
HASHSET:底层是将你加入其中的对象进行HASH排列后在放的时候,对比你放入的对象在其中是否有相同的对象存在,如果存在就不放入,反之放入。
HASHMAP:底层是将你加入其中的对象进行HASH排列后在放的时候,将key和对应的value发在一起,可以随时用key找到value,所以其中如果你让如相同的key但value不同时,后者value会替换前者。
所以,如果你不希望存相同的值是,用HASHSET,你希望能很方便的用key找到value时,用HASHMAP.
⑸ JAVA里面set,map,list的区别是什么(尽量详细)
java集合的主要分为三种类型:
Set(集)
List(列表)
Map(映射)
要深入理解集合首先要了解下我们熟悉的数组:
数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),而JAVA集合可以存储和操作数目不固定的一组数据。 所有的JAVA集合都位于 java.util包中! JAVA集合只能存放引用类型的的数据,不能存放基本数据类型。
简单说下集合和数组的区别:(参考文章:《Thinking In Algorithm》03.数据结构之数组)
Java所有“存储及随机访问一连串对象”的做法,array是最有效率的一种。
1、
效率高,但容量固定且无法动态改变。
array还有一个缺点是,无法判断其中实际存有多少元素,length只是告诉我们array的容量。
2、Java中有一个Arrays类,专门用来操作array。
arrays中拥有一组static函数,
equals():比较两个array是否相等。array拥有相同元素个数,且所有对应元素两两相等。
fill():将值填入array中。
sort():用来对array进行排序。
binarySearch():在排好序的array中寻找元素。
System.array():array的复制。
若撰写程序时不知道究竟需要多少对象,需要在空间不足时自动扩增容量,则需要使用容器类库,array不适用。所以就要用到集合。
那我们开始讨论java中的集合。
集合分类:
Collection:List、Set
Map:HashMap、HashTable