当我们用Java创建一个Collection(ArrayList,HashMap)时,Java是否在内部创建了某种索引以便更快地检索数据?在Oracle中,我们必须手动创建索引,但Java中使用的技术(如果有的话)是什么
答案 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
。既然地图在链表中有第一个节点,它将遍历此链表的所有元素,直到它找到与您提供的键相等的键。