Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.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 映射键的最快速度是什么:Enum.valueOf(~)vs String.hashCode()?_Java_Enums_Hashmap - Fatal编程技术网

Java 映射键的最快速度是什么:Enum.valueOf(~)vs String.hashCode()?

Java 映射键的最快速度是什么:Enum.valueOf(~)vs String.hashCode()?,java,enums,hashmap,Java,Enums,Hashmap,我很难比较两者。因此,我吸引的是比我有更详细知识的人。 我必须将函数对象链接到名称(当然是字符串),函数调用如下: serviceInstance.useThis(String name, Object parameter); 到目前为止,我正在考虑此API的“后端”的三个选项: 枚举+枚举映射 纯枚举 哈希映射 1和2基本相同,但1是为了防止我需要将枚举重新用于其他用途。 我主要关心的是Enum.valueOf(String name)与String.hashCode()相比有多快 以下是我

我很难比较两者。因此,我吸引的是比我有更详细知识的人。 我必须将函数对象链接到名称(当然是字符串),函数调用如下:

serviceInstance.useThis(String name, Object parameter);
到目前为止,我正在考虑此API的“后端”的三个选项:

  • 枚举+枚举映射
  • 纯枚举
  • 哈希映射
  • 1和2基本相同,但1是为了防止我需要将枚举重新用于其他用途。 我主要关心的是Enum.valueOf(String name)与String.hashCode()相比有多快

    以下是我正在使用的两种实现:

    public class HashMapHandlerType{
    
        static HashMap<String, MyInterfaceProvider> handlers = ~ ;
    
        public void useThis(String name, Object parameter) throws IllegalArgumentException {
            MyInterfaceProvider prov = handlers.get(name);
            if(prov != null){
                prov.get().use(parameter);
            }else{
                throw new IllegalArgumentException(name);
            }
        }
    
    }
    
    public class EnumTypeHandler{
    
        public void useThis(String name, Object parameter) throws IllegalArgumentException {
            HandlersEnum.valueOf(name).get().use(parameter);
        }
    
    }
    
    公共类HashMapHandlerType{
    静态HashMap处理程序=~;
    public void useThis(字符串名称、对象参数)引发IllegalArgumentException{
    MyInterfaceProvider prov=handlers.get(名称);
    如果(prov!=null){
    prov.get().use(参数);
    }否则{
    抛出新的IllegalArgumentException(名称);
    }
    }
    }
    公共类EnumTypeHandler{
    public void useThis(字符串名称、对象参数)引发IllegalArgumentException{
    HandlersEnum.valueOf(name).get().use(参数);
    }
    }
    
    Enum的优点是,如果我想使用EnumMap,就不用担心EnumMap中的冲突。
    但是,Enum的valueOf是否足够快,可以在哈希函数中处理String.hashCode()+的潜在冲突?

    Louis Wasserman的评论回答了具体的问题。这是如何处理这类问题的更一般的答案

    • 将数据结构及其访问方法封装在一个类中 只有该类的代码取决于设计选择
    • 编写最简单、最干净、最可维护的实现选项
    • 衡量程序的性能
    • 如果需要更快,请配置文件
    • 如果概要文件显示与数据结构相关联的方法占用了大部分时间,那么编写并度量一个或多个替代实现。挑最快的

    这有两大优势。如果这个问题不重要,因为最简单的实现速度足够快,那么您就不会在上面浪费任何时间。如果相对性能问题真的很重要,您可以在实际程序的上下文中使用真实数据进行测量。

    使用valueOf it时,基本上是在惰性地创建映射。此外,在创建贴图时,它使用反射来获取值。因为与使用String.hashCode()相比,反射调用的成本肯定很高,在您的情况下,String.hashCode()可能已经计算过了。

    快速是什么意思?我猜是复杂度,但也是纯粹的执行时间。假设字符串是“new”,并且在上一次操作中没有计算hashCode。映射的大小是多少?你要插入什么类型的数据?我想最多有一百个元素。字符串值是任意的,但可以假定接近英语名词。
    Enum.valueOf
    无论如何都将委托给后端的
    HashMap