使用hashCode获取数组java元素的索引

使用hashCode获取数组java元素的索引,java,arrays,hash,hashcode,Java,Arrays,Hash,Hashcode,我有一个包含很多单词的字符串数组。我希望获得数组中包含的单词的索引(-1,如果不包含) 我首先做了一个循环来搜索数组中的所有元素,同时递增一个变量,当我找到它时,我返回变量的值 但是,数组可能非常大,因此搜索所有元素的速度非常慢。我决定在字符串数组中添加一个新词之前,我将使用hashCode()%arrayLength获取我应该将它放在哪里的索引。然后,为了获取索引,我只需重用hashCode()%arrayLength即可立即知道它位于什么索引处 问题是有时会出现“冲突”,两个元素在数组中可能

我有一个包含很多单词的字符串数组。我希望获得数组中包含的单词的索引(-1,如果不包含)

我首先做了一个循环来搜索数组中的所有元素,同时递增一个变量,当我找到它时,我返回变量的值

但是,数组可能非常大,因此搜索所有元素的速度非常慢。我决定在字符串数组中添加一个新词之前,我将使用
hashCode()%arrayLength
获取我应该将它放在哪里的索引。然后,为了获取索引,我只需重用
hashCode()%arrayLength
即可立即知道它位于什么索引处

问题是有时会出现“冲突”,两个元素在数组中可能具有相同的索引


有人知道怎么处理吗?或者其他任何可以更快地获取元素索引的方法

您正在尝试使用数组实现。除非这是一个家庭作业,否则Java标准库已经有了解决搜索和冲突问题的类

您可能需要使用
哈希集
来检查
字符串是否存在。在幕后,它使用的是
HashMap
,它实现了解决冲突

String[] words = { "a" };
Set<String> set = new HashSet<>(Arrays.asList(words));
return set.contains("My Word") ? 1 : -1;
String[]words={“a”};
Set=newhashset(Arrays.asList(words));
返回集。包含(“我的话”)?1 : -1;

您所指的技术通常是哈希表的实现之一。它被称为线性探测,这是一种称为开放寻址的通用技术。如果已根据
hashCode()%array.length
计算单词的索引,并找到冲突(非空元素或不是要查找的元素);然后,您有三种执行冲突解决的方法:

线性搜索 这是通过增加位置来完成的,并检查它是否为空或是否包含您要查找的元素。也就是说,您的第二个位置将是
(hashCode(输入)+2)%array.length
,然后是
(hashCode(输入)+3)%array.length
,依此类推。这种方法的问题是,如果阵列接近完全填充,则插入或查找性能将降级为线性O(n)

二次搜索 这只是对上述技术的优化,如果发现冲突,可以快速跳跃。因此,您的第二个索引将是
(hashCode(输入)+2*2)%array.length
,然后是
(hashCode(输入)+3*3)%array.length
等等,这有助于更快地找到正确的位置

双重散列 通过引入另一个哈希函数
hashCode2()
,这是一种处理解析的更有效方法,该函数与第一个函数结合使用。在这种情况下,下一个搜索索引将是
(hashCode(输入)+2*hashCode2(输入))%array.length
,然后是
(hashCode(输入)+3*hashCode2(输入))%array.length
,依此类推

跳转越是随机分布,它在大型哈希表上的性能就越好


希望这有帮助

您是否正在尝试重新实现
HashMap
?而不是将对象放置在数组中。为什么不把它们放在一个
HashMap
中,其中的键是散列码。@这不会处理散列冲突问题。@DodgyCodeException他没有得到散列冲突。他在另一项的数组中得到相同的索引。他正在使用模运算来计算指数。即使使用不同的散列,使用moduleus也很容易得到相同的索引。