Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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 快速静态键值映射_Java_String_Performance_Map - Fatal编程技术网

Java 快速静态键值映射

Java 快速静态键值映射,java,string,performance,map,Java,String,Performance,Map,我有一组唯一的键值对,键和值都是字符串。对的数量非常巨大,找到某个字符串的值对时间非常关键 这些对是预先计算出来的,并且是针对某个程序给出的。因此,我可以编写一个包含以下内容的方法: public String getValue(String key) { //repeat for every pair if(key.equals("abc")) { return "def"; } } 但我说的是超过250000对,也许对它们进行排序会更快 我有

我有一组唯一的键值对,键和值都是字符串。对的数量非常巨大,找到某个字符串的值对时间非常关键

这些对是预先计算出来的,并且是针对某个程序给出的。因此,我可以编写一个包含以下内容的方法:

public String getValue(String key)
{
    //repeat for every pair
    if(key.equals("abc"))
    {
        return "def";
    }
}
但我说的是超过250000对,也许对它们进行排序会更快

我有一个类,它包含
getValue()
方法,可以使用它的构造函数,但没有与任何数据库/文件系统等的连接。因此,每个对都必须在类内定义

你有什么想法比一系列的if语句更快吗?也许使用一个排序映射来对这些对进行预排序。也许可以通过反序列化已经创建的映射来缩短构造函数时间

我想你的答案包含一个基本的代码例子,你的做法,我会评论答案与他们相应的时间,它采取了一套配对

时间范围:一个构造函数调用和20个
getValue()
1000毫秒的调用

键的大小为256,值的大小为<16

这正是a的用途。如果实现正确,它可以提供
O(1)
查找,这意味着只要您有足够的内存,并且您的哈希函数和冲突策略是智能的,它就可以在固定时间内获取密钥值。Java有多个基于散列的数据结构,从事物的声音来看,
HashMap
可以为您提供帮助

您可以这样构造它:

 Map<String, String> myHashTable = new HashMap<String, String>();
 myHashTable.put("abcd","value corresponding to abcd");
myHashTable.get("abcd");
并获取如下键的值:

 Map<String, String> myHashTable = new HashMap<String, String>();
 myHashTable.put("abcd","value corresponding to abcd");
myHashTable.get("abcd");
当你直觉到运行所有的键和检查是没有效率的时候,你就在正确的轨道上,这将是一种
O(n)
运行时方法,因为你必须运行所有
n
元素

这正是a的用途。如果实现正确,它可以提供
O(1)
查找,这意味着只要您有足够的内存,并且您的哈希函数和冲突策略是智能的,它就可以在固定时间内获取密钥值。Java有多个基于散列的数据结构,从事物的声音来看,
HashMap
可以为您提供帮助

您可以这样构造它:

 Map<String, String> myHashTable = new HashMap<String, String>();
 myHashTable.put("abcd","value corresponding to abcd");
myHashTable.get("abcd");
并获取如下键的值:

 Map<String, String> myHashTable = new HashMap<String, String>();
 myHashTable.put("abcd","value corresponding to abcd");
myHashTable.get("abcd");

当你直觉到运行所有的键和检查是没有效率的时候,你就在正确的轨道上,这将是一种
O(n)
运行时方法,因为你必须运行所有
n
元素

钥匙有固定的长度?是的,如果这能使它更快的话,它们有固定的长度!99%的密钥大小为256,1%小于256。1%不重要!钥匙有固定的长度?是的,如果这能使它更快的话,它们有固定的长度!99%的密钥大小为256,1%小于256。1%不重要!您建议如何初始化地图?因为地图的创建/插入也很重要。谢谢你的回答!我在上面的评论中提出的问题是:提前创建映射是否比序列化映射更快。因为插入是这里的瓶颈…我不确定我是否理解这个问题,或者你所说的“然后序列化它”到底是什么意思,但是你肯定只想创建一次哈希表,而不是每次你必须搜索它或在其中插入什么,如果这是你要问的。相对而言,读取25万个值需要一些时间,而且由于I/O成本很高,因此您不想经常这样做。我的想法是初始化hashmap并插入所有对。然后序列化它。在时间关键部分,我有一个包含序列化映射的字符串。我没有在时间关键块中插入所有对,而是用已经插入的所有对反序列化映射;你建议的初始化地图的方法是什么?因为地图的创建/插入也很重要。谢谢你的回答!我在上面的评论中提出的问题是:提前创建映射是否比序列化映射更快。因为插入是这里的瓶颈…我不确定我是否理解这个问题,或者你所说的“然后序列化它”到底是什么意思,但是你肯定只想创建一次哈希表,而不是每次你必须搜索它或在其中插入什么,如果这是你要问的。相对而言,读取25万个值需要一些时间,而且由于I/O成本很高,因此您不想经常这样做。我的想法是初始化hashmap并插入所有对。然后序列化它。在时间关键部分,我有一个包含序列化映射的字符串。我没有在时间关键块中插入所有对,而是用已经插入的所有对反序列化映射;事先做好。