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的“后端”的三个选项:
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
。