Java是否使用Oracle等数据结构的索引

时间:2014-01-16 18:32:20

标签: java oracle indexing

当我们用Java创建一个Collection(ArrayList,HashMap)时,Java是否在内部创建了某种索引以便更快地检索数据?在Oracle中,我们必须手动创建索引,但Java中使用的技术(如果有的话)是什么

2 个答案:

答案 0 :(得分:0)

是的.Java确实隐藏了这些实现细节。但是对于java提供的性能,可能会在内部使用一些索引技术。当你提到“Oracle”时,我相信它是SQL或数据库软件,而不是像Java这样的语言。

答案 1 :(得分:0)

对于ArrayList,每个Object都有一个唯一索引(即使是重复的对象)。

可以使用ArrayList.get()通过索引轻松访问对象。索引基于添加对象的顺序(假设您尚未对ArrayList进行排序或以其他方式更改顺序)。从ArrayList中删除对象时,其前面的所有元素(索引较大)都会向左移动,以使其索引变为index - 1

HashMap使用稍微复杂的索引方案......

对于HashMap,所有索引信息首先对您隐藏,因此您不需要知道这一点,除非您想了解其内部工作原理(这是一件好事!)但是使用索引... HashMap使用Entry的数组(它自己的Map.Entry实现)来存储信息。 Entry表示链接列表中的节点(不要与对象java.util.LinkedList混淆),它存储键,值和链接列表中的下一个节点。

HashMap中条目的索引只是h & (length - 1),其中h是密钥的hashCode,通过{{内部的自定义哈希方法传递1}} package(你将无法访问它),而java.util是一个2的幂整数,表示length数组的大小(如果需要,它会自动增长)定)。

当然,如果两个密钥最终计算相同的散列,则可能会发生一些冲突。这就是Entry使用链接列表数组的原因。在发生冲突的情况下,两个HashMap具有相同的哈希值,其中一个可以标记为另一个{1>}。

要获取Entry中的对象,索引是根据您通过HashMap提供的密钥计算的,并且从get(key)数组中检索相关的Entry。既然地图在链表中有第一个节点,它将遍历此链表的所有元素,直到它找到与您提供的键相等的键。