Java 基于长值的HashMap,get/put o(1)?
因此,我有一个游戏,在玩家登录后,我将玩家对象放入一个数组,在速度方面,我没有太多问题,因为我也存储了玩家的数组索引,但在某些系统中,我确实遇到了问题,速度方面 例如,一个玩家想要向另一个玩家“发送消息”,客户端发送一个包含该玩家姓名的数据包,就像一个唯一的长值一样,然后该数据包在整个玩家列表数组上循环,比较姓名的长值,然后将其发送给找到的玩家 我的想法是创建一个HashMap,它使用Long值作为保证o(1)查找的键,尽管这只是一个概念,我还没有尝试过 (我在登录时存储name的nameHash/long值,这样计算它就不会成为瓶颈) 这能保证进行o(1)次查找吗?字符串的长值真的是唯一的吗? 字符串到长(int64)方法->Java 基于长值的HashMap,get/put o(1)?,java,performance,hashmap,Java,Performance,Hashmap,因此,我有一个游戏,在玩家登录后,我将玩家对象放入一个数组,在速度方面,我没有太多问题,因为我也存储了玩家的数组索引,但在某些系统中,我确实遇到了问题,速度方面 例如,一个玩家想要向另一个玩家“发送消息”,客户端发送一个包含该玩家姓名的数据包,就像一个唯一的长值一样,然后该数据包在整个玩家列表数组上循环,比较姓名的长值,然后将其发送给找到的玩家 我的想法是创建一个HashMap,它使用Long值作为保证o(1)查找的键,尽管这只是一个概念,我还没有尝试过 (我在登录时存储name的nameHas
public static long toLong(String s) {
long l = 0L;
for(int i = 0; i < s.length() && i < 12; i++) {
char c = s.charAt(i);
l *= 37L;
if(c >= 'A' && c <= 'Z') l += (1 + c) - 65;
else if(c >= 'a' && c <= 'z') l += (1 + c) - 97;
else if(c >= '0' && c <= '9') l += (27 + c) - 48;
}
while(l % 37L == 0L && l != 0L) l /= 37L;
return l;
}
公共静态长托龙(字符串s){
长l=0L;
对于(int i=0;i 如果(c>='A'&&c='A'&&c='0'&&c>听起来像是过度思考了。字符串已经有一个hashcode函数,那么为什么需要将其重新命名为long?您可以直接将名称作为键添加到HashMap中。听起来像是过度思考了。字符串已经有一个hashcode函数,那么为什么需要将其重新命名为long?您可以直接将名称作为键添加到HashMap中。听起来好像您对其进行了过度思考。String已经有了hashcode函数,那么为什么需要将其重新命名为long?您可以直接将名称作为键添加到HashMap中。听起来好像您对其进行了过度思考。String已经有了hashcode函数,为什么您需要这样做你可以直接在HashMap中添加名称作为键
映射可以使用字符串作为键,非常快,我认为它使用字符串的哈希代码。您也不必处理哈希代码冲突,因为它在内部处理。没有任何集合类型会发出内部哈希冲突错误
如果使用“代码”>CaseKEX/code>,一个映射将更快(O(1),与数组迭代相反,它可以在O(n)和O(N2)之间取决于代码),但更重要的问题是应用程序需要的并发性。如果从多个线程使用这个集合,可以考虑使用。
关于HashMap如何工作的简短描述:
映射可以使用字符串作为键,非常快,我认为它使用字符串的哈希代码。您也不必处理哈希代码冲突,因为它在内部处理。没有任何集合类型会发出内部哈希冲突错误
如果使用“代码”>CaseKEX/code>,一个映射将更快(O(1),与数组迭代相反,它可以在O(n)和O(N2)之间取决于代码),但更重要的问题是应用程序需要的并发性。如果从多个线程使用这个集合,可以考虑使用。
关于HashMap如何工作的简短描述:
映射可以使用字符串作为键,非常快,我认为它使用字符串的哈希代码。您也不必处理哈希代码冲突,因为它在内部处理。没有任何集合类型会发出内部哈希冲突错误
如果使用“代码”>CaseKEX/code>,一个映射将更快(O(1),与数组迭代相反,它可以在O(n)和O(N2)之间取决于代码),但更重要的问题是应用程序需要的并发性。如果从多个线程使用这个集合,可以考虑使用。
关于HashMap如何工作的简短描述:
映射可以使用字符串作为键,非常快,我认为它使用字符串的哈希代码。您也不必处理哈希代码冲突,因为它在内部处理。没有任何集合类型会发出内部哈希冲突错误
如果使用“代码”>CaseKEX/code>,一个映射将更快(O(1),与数组迭代相反,它可以在O(n)和O(N2)之间取决于代码),但更重要的问题是应用程序需要的并发性。如果从多个线程使用这个集合,可以考虑使用。
关于HashMap如何工作的简短描述:我同意Necreaux的观点
无论如何,如果你想要答案,没有任何共谋,你可以有O(1)时间复杂度,但在java中检测和纠正冲突HashMap也使用Equals方法,渐进地你仍然可以说它是O(1)
可能会帮助您找到更多详细信息我同意Necreaux
无论如何,如果你想要答案,没有任何共谋,你可以有O(1)时间复杂度,但在java中检测和纠正冲突HashMap也使用Equals方法,渐进地你仍然可以说它是O(1)
可能会帮助您找到更多详细信息我同意Necreaux
无论如何,如果你想要答案,没有任何共谋,你可以有O(1)时间复杂度,但在java中检测和纠正冲突HashMap也使用Equals方法,渐进地你仍然可以说它是O(1)
可能会帮助您找到更多详细信息我同意Necreaux
无论如何,如果你想要答案,没有任何共谋,你可以有O(1)时间复杂度,但在java中检测和纠正冲突HashMap也使用Equals方法,渐进地你仍然可以说它是O(1)
可能有助于您查找更多详细信息这是正确的方法。此外,字符串的哈希代码在计算后会被缓存,因此对同一字符串多次调用hashcode()
不会产生额外的成本。唯一的问题是,OP使用的协议需要使用