Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 基于长值的HashMap,get/put o(1)?_Java_Performance_Hashmap - Fatal编程技术网

Java 基于长值的HashMap,get/put o(1)?

Java 基于长值的HashMap,get/put o(1)?,java,performance,hashmap,Java,Performance,Hashmap,因此,我有一个游戏,在玩家登录后,我将玩家对象放入一个数组,在速度方面,我没有太多问题,因为我也存储了玩家的数组索引,但在某些系统中,我确实遇到了问题,速度方面 例如,一个玩家想要向另一个玩家“发送消息”,客户端发送一个包含该玩家姓名的数据包,就像一个唯一的长值一样,然后该数据包在整个玩家列表数组上循环,比较姓名的长值,然后将其发送给找到的玩家 我的想法是创建一个HashMap,它使用Long值作为保证o(1)查找的键,尽管这只是一个概念,我还没有尝试过 (我在登录时存储name的nameHas

因此,我有一个游戏,在玩家登录后,我将玩家对象放入一个数组,在速度方面,我没有太多问题,因为我也存储了玩家的数组索引,但在某些系统中,我确实遇到了问题,速度方面

例如,一个玩家想要向另一个玩家“发送消息”,客户端发送一个包含该玩家姓名的数据包,就像一个唯一的长值一样,然后该数据包在整个玩家列表数组上循环,比较姓名的长值,然后将其发送给找到的玩家

我的想法是创建一个HashMap,它使用Long值作为保证o(1)查找的键,尽管这只是一个概念,我还没有尝试过

(我在登录时存储name的nameHash/long值,这样计算它就不会成为瓶颈)

这能保证进行o(1)次查找吗?字符串的长值真的是唯一的吗?

字符串到长(int64)方法->

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使用的协议需要使用