Tag: hashset

Java:基于磁盘的快速哈希集

我需要存储一个大的哈希集,能够包含多达大约2亿个40位值。 将其存储为2亿64位值是可以接受的(尽管有2亿* 16位丢失)。 要求是: 微小的内存占用(磁盘空间不是问题,内存是) fast contains(long l)和add(long l)方法(比SQL快得多) 嵌入式 免费且没有讨厌的许可(没有Berkeley DB)。 LGPL很好。 没有误报,也没有误报,所以像基于磁盘的布隆filter这样的东西不是我追求的 SQL 不是我追求的。 因为我真的认为我更喜欢这样的事情(注意解决方案比SQL解决方案快得多): 快速的基于磁盘的哈希表? Google有这样的Java API吗? 基于磁盘的快速键/值对实现我只使用’key’工作吗? 或者是其他东西? 我宁愿不重新发明。

为什么HashMap比HashSet更快?

我一直在阅读/研究HashMap比HashSet更快的原因。 我不太了解以下陈述: HashMap比HashSet更快,因为值与唯一键相关联。 在HashSet ,成员对象用于计算哈希码值,对于两个对象,哈希码值可以相同,因此使用equals()方法检查是否相等。 如果返回false ,则表示两个对象不同。 在HashMap ,使用密钥对象计算哈希码值。 使用密钥对象计算HashMap哈希码值。 这里,成员对象用于计算哈希码,对于两个对象可以是相同的,因此使用equals()方法来检查相等性。 如果返回false ,则表示两个对象不同。 总结我的问题: 我认为HashMap和HashSet以相同的方式计算哈希码。 他们为什么不同? 你能提供一个具体的例子, HashSet和HashMap如何以不同的方式计算哈希码? 我知道什么是“关键对象”,但是“成员对象”是什么意思? HashMap可以做与HashSet相同的事情,并且速度更快。 为什么我们需要HashSet ? 例: HashMap = new HashMap(); map.put(“obj1”,true); => exist map.get(“obj1”); =>if null = not exist, else exist

HashSet与JDK 7/8的顺序和区别

这是一个两部分问题: HashSet是否实现了一些隐藏的排序机制,或者只是引用文档: It makes no guarantees as to the iteration order of the set; in particular, it does not guarantee that the order will remain constant over time. It makes no guarantees as to the iteration order of the set; in particular, it does not guarantee that the order will remain constant over time. 告诉我,未来有时可能会改变订单和/或取决于内存使用情况? […]

使用与HashSet对应的固定Key创建HashMap。 出发点

我的目标是创建一个以String作为键的hashmap,并将条目值作为字符串的HashSet。 OUTPUT 这就是输出现在的样子: Hudson+(surname)=[Q2720681], Hudson,+Quebec=[Q141445], Hudson+(given+name)=[Q5928530], Hudson,+Colorado=[Q2272323], Hudson,+Illinois=[Q2672022], Hudson,+Indiana=[Q2710584], Hudson,+Ontario=[Q5928505], Hudson,+Buenos+Aires+Province=[Q10298710], Hudson,+Florida=[Q768903]] 根据我的想法,它应该是这样的: [Hudson+(surname)=[Q2720681,Q141445,Q5928530,Q2272323,Q2672022]] 目的是在Wikidata中存储特定名称,然后将与其相关的所有Q值消除歧义,例如: 这是“布什”的页面。 我希望布什成为关键,然后对于所有不同的出发点, Bush可能与维基数据的终端页面相关联的所有不同方式,我想存储相应的“Q值”,或者是唯一的阿尔法 – 数字标识符。 我实际上在做的是尝试从维基百科歧义消除不同的名称,值,然后在wikidata中查找与该值相关联的唯一字母数字标识符。 例如, Bush我们有: George HW Bush George W. Bush Jeb Bush Bush family Bush (surname) 因此,Q值为: 乔治HW布什 (Q23505) 乔治W.布什 (Q207) 杰布·布什 (Q221997) 布什家族 (Q2743830) 布什 (Q1484464) 我的想法是数据结构应该按照以下方式解释 关键: Bush 入围集: Q23505, Q207, Q221997, Q2743830, Q1484464 […]

为什么HashSet的内部实现会创建虚拟对象以在HashMap中作为值插入而不是插入空值?

HashSet是使用HashMap实现的,当我们向HashSet添加任何e1时,如果e1不在集合中,它会在HashMap中添加(e1,new Object())。 我的问题是为什么他们插入新的Object(),当他们可以插入像(e1,null),这是更优化的方法,因为没有创建新的对象。 在这里插入空值有什么缺点吗?

更改集合中的元素会更改“等于”语义

想象一下,我们有这段代码。 public class HashAddAfter { private class A { public int value; public A(int value) { this.value = value; } public void setValue(int value) { this.value = value; } // Code for hashCode()… // Code for equals()… } Set list1 = new HashSet(); Set list2 = new HashSet(); public static void main(String[] args) { HashAddAfter […]

Java:优化hashset以进行大规模重复检测

我正在处理一个项目,我正在处理很多推文; 我的目标是在处理它们时删除重复项。 我有推文ID,其格式为”166471306949304320″ 我一直在使用HashSet ,它可以正常工作一段时间。 但到了大约1000万件物品的时候,我已经陷入困境并最终得到GC错误,大概是从重新开始。 我试着定义一个更好的尺寸/负载 tweetids = new HashSet(220000,0.80F); 这让它变得更远,但仍然非常缓慢(大约1000万,它需要花费3倍的时间来处理)。 我该如何优化呢? 鉴于我已经大致知道在结尾集合中应该有多少项目(在这种情况下,大约20-2200万)我应该创建一个只重复两次或三次的HashSet,或者这样的开销是多少?设置了太多的时间罚款? 如果我没有使用String,或者我定义了一个不同的HashCode函数(在这种情况下是String的特定实例,我不知道该怎么做),事情会更好吗? 这部分实现代码如下。 tweetids = new HashSet(220000,0.80F); // in constructor duplicates = 0; … // In loop: For(each tweet) String twid = (String) tweet_twitter_data.get(“id”); // Check that we have not processed this tweet already if (!(tweetids.add(twid))){ duplicates++; continue; } 解 感谢您的推荐,我解决了这个问题。 问题是哈希表示所需的内存量; […]

更改HashSet中的值

我已经读过这个问题: 改变集合中的元素会改变’equals’语义 但是,我不知道如何解决我无法更改HashSet中的项目并在以后删除它的问题。 我有一些示例源代码: public static void main(String[] args) { TestClass testElement = new TestClass(“1”); Set set = new HashSet(); set.add(testElement); printIt(testElement, set, “First Set”); testElement.setS1(“asdf”); printIt(testElement, set, “Set after changing value”); set.remove(testElement); printIt(testElement, set, “Set after trying to remove value”); testElement.setS1(“1”); printIt(testElement, set, “Set after changing value back”); set.remove(testElement); printIt(testElement, set, “Set removing value”); […]

Java中的HashSets如何工作?

可能重复: Java hashmap如何工作? 有人可以向我解释一下java中的HashSets是如何工作的以及为什么它们比使用ArrayLists更快?

可以将StringBuffer对象作为Java中TreeSet中的键吗?

我有以下代码,我试图将StringBuffer对象作为键设置在TreeSet中。 我这样做的原因是看我是否可以将可变对象作为键。 我没有得到任何编译错误。 但是当我运行此代码时,我得到的代码下面的错误。 特别是,我得到这个java.lang.StringBuffer cannot be cast to java.lang.Comparable 。 这个错误表明了什么? 从javadoc我看到StringBuffer类被声明为final( public final class StringBuffer ),这是不是意味着它是不可变的,因此可以散列? 我是哈希和不变的东西的新手,所以请在这里帮助我。 谢谢 import java.util.*; class MutableKeys { public static void main(String[] args) { StringBuffer one = new StringBuffer(“one”); StringBuffer two = new StringBuffer(“two”); StringBuffer three = new StringBuffer(“three”); Set sb=new TreeSet(); sb.add(one); sb.add(two); sb.add(three); System.out.println(“set before change: […]