Java 大数据库,很多地图?
作为学生项目的一部分,我正在构建一个大型数据库,理论上可以包含数百万个对象 我从名字开始(即Person fName=“John”) 我的计划是将“John”转换为hashcode,将hashcode转换为整数,然后将其作为-(因为整数比较更快)存储在映射中 现在我的问题是——为了加快迭代,我希望有单独的静态映射,根据名称的第一个字母进行访问。像Java 大数据库,很多地图?,java,database,Java,Database,作为学生项目的一部分,我正在构建一个大型数据库,理论上可以包含数百万个对象 我从名字开始(即Person fName=“John”) 我的计划是将“John”转换为hashcode,将hashcode转换为整数,然后将其作为-(因为整数比较更快)存储在映射中 现在我的问题是——为了加快迭代,我希望有单独的静态映射,根据名称的第一个字母进行访问。像 public class FirstNameList { private static Map<Integer, String>
public class FirstNameList {
private static Map<Integer, String> a = new HashMap<Integer, String>();
private static Map<Integer, String> b = new HashMap<Integer, String>();
private static Map<Integer, String> c = new HashMap<Integer, String>();
// etc
public void addFName(String word) {
if (word.length() == 0)
throw new IllegalArgumentException("No name entered");
word = word.toLowerCase();
char x = word.charAt(0);
Integer i = word.hashCode();
x-correctMap.put(i, word);
}
公共类名字列表{
私有静态映射a=新HashMap();
私有静态映射b=新HashMap();
私有静态映射c=newhashmap();
//等
public void addFName(字符串字){
if(word.length()==0)
抛出新的IllegalArgumentException(“未输入名称”);
word=word.toLowerCase();
char x=word.charAt(0);
整数i=word.hashCode();
x-correctMap.put(i,word);
}
然而,用26条if语句来选择正确的列表并不是很有效。有人知道选择正确地图的方法吗?或者仅仅是更好的想法吗?你可以嵌套地图,第一个地图的关键是字母。我有三条建议:第一条是直接回答你的问题:
- 首先,您可以将地图存储在以初始字符为键的地图中,然后只需在“主地图”中查找正确的地图
- 第二,这不会比简单地将所有内容存储在一个映射中更快,也可能更慢。千万不要假设你比没有度量来证明存在问题的库类的作者更聪明
- 第三,你说的是“数据库”,那么为什么不使用数据库来代替所有这些呢?Postgres和MySQL都是免费的,易于使用,可以很好地满足你的需求
此外,使用字符串的哈希代码然后进行哈希运算可能不会比只使用字符串快。“我们应该忘记效率低的问题,比如说大约97%的时间:过早优化是万恶之源。”。你没有问题,但你需要一个解决方案。保持简单。如果你键入字符串,有一种称为三元树的数据结构非常适合这一点。你可以找到更多关于三元树的信息,并且有一个关于在Java中实现三元树的方法。谢谢。第三种方法是我稍后会研究的,但坚持我假设的映射当存储桶达到一定大小时,使用更小的映射进行迭代会更快。高兴地退出!@Geo1986--
HashMap
将“重新启动”通过更改存储桶的数量,使负载因子保持在您可以设置的阈值以下。dfb我认为转换为整数会使映射中的相等值更快,然后比较两个字符串,如果存储桶的大小为数千,则可能会产生差异,这是否没有性能优势?树形映射是否适合quick如果元素的大小是数百万,你会得到它吗?