是什么区别HashMap,LinkedHashMap而TreeMap在Java中?我没有看到输出有任何差异,因为所有三个都有keySet和values.什么是Hashtables?
Map m1 = new HashMap();
m1.put("map", "HashMap");
m1.put("schildt", "java2");
m1.put("mathew", "Hyden");
m1.put("schildt", "java2s");
print(m1.keySet());
print(m1.values());
SortedMap sm = new TreeMap();
sm.put("map", "TreeMap");
sm.put("schildt", "java2");
sm.put("mathew", "Hyden");
sm.put("schildt", "java2s");
print(sm.keySet());
print(sm.values());
LinkedHashMap lm = new LinkedHashMap();
lm.put("map", "LinkedHashMap");
lm.put("schildt", "java2");
lm.put("mathew", "Hyden");
lm.put("schildt", "java2s");
print(lm.keySet());
print(lm.values());
Run Code Online (Sandbox Code Playgroud) 在这个问题中如何在C++ 11中有效地选择标准库容器?是一个在选择C++集合时使用的方便流程图.
我认为这对于那些不确定他们应该使用哪个集合的人来说是一个有用的资源,所以我试图找到类似Java的流程图而无法这样做.
什么资源和"备忘单"可以帮助人们选择在Java编程时使用的正确的集合?人们如何知道应该使用哪些List,Set和Map实现?
我今天接受了采访,接受采访的人对他的陈述感到困惑,询问是否可能TreeSet等于HashSet但不HashSet等于TreeSet。我说“不”,但据他说,答案是“是”。
怎么可能?
我熟悉Java Collection Framework,它包含基本的接口:Collection和Map.我想知道为什么框架不包含作为基本集合的树和图形的结构.两者都可以视为子类型Collection.
顺便说一句,我知道TreeSet是由Red-Black Tree底层实现的.但是,TreeSet它不是树而是a Set,因此框架中没有真正的树.
我一直在阅读关于这个主题的大量博客,但我仍然无法清楚地知道何时使用另一个散列集或树集.
举一个例子:
我有一个类似的对象.我把它们放在HashSet中.现在当(只在我想要的时候)我想设置基于compareTo逻辑进行排序时,我可以调用Collections.sort(object)
而TreeSet的默认一直使用的compareTo或比较(OBJ1,OBJ2)所有的时间.因此,TreeSet会遇到性能,但输出与#1(Collections.sort)相同.
这种理解是否正确?
我何时应该使用arrayList?何时应该使用LinkedList?
什么时候应该使用TreeSet,LinkedHashSet并HashSet?
六年前,我烧了几天试图追捕我完全确定的框架随机响应的地方.在精心追逐整个框架确保它全部使用相同的Random实例后,我继续追逐单步执行代码.这是高度重复的迭代自调用代码.更糟糕的是,该死的效果只会在完成大量迭代后出现.在+6小时之后,当我在javadoc中为HashSet.iterator()发现一行时,我终于处于智慧状态,表明它不能保证返回元素的顺序.然后我浏览了整个代码库,并用LinkedHashSet替换了所有HashSet实例.而且,我的框架正好向确定性生活迈进!哎呀!
我现在刚刚经历过同样的FREAKIN影响(至少这次只有3个小时).无论出于何种原因,我都错过了HashMap碰巧为其keySet()获得相同方式的细节.
这是关于这个主题的SO线程,虽然讨论从来没有完全回答我的问题:HashSet的迭代顺序
所以,我很好奇为什么会这样.鉴于我两次都有一个庞大的单线程java应用程序在完全相同的实例化/插入空间中使用完全相同的JVM参数(来自同一批处理文件的多次运行)在同一台计算机上运行,几乎没有其他任何运行,这可能会扰乱JVM使得HashSet和HashMap在经过大量迭代之后会表现得不可预测(并不是因为javadoc说不依赖于顺序而不一致)?
从源代码(java.util中的这些类的实现)或者你对JVM的了解(可能是某些GC影响内部java类在分配内部存储空间时获得非零内存的位置)的任何想法?
我为Project Euler编写了一个Java程序#35:Circular Primes:
这个数字197被称为圆形素数,因为数字的所有旋转:197,971和719本身都是素数.
在100:2,3,5,7,11,13,17,31,37,71,73,79和97之下有十三个这样的素数.
一百万以下有多少个圆形素数?
我的代码编译并运行正常,但是,根据我使用的数据结构,它会给出不同的结果.
该算法的工作方式如下:
获得预先计算的素数.这是对MathUtils.getPrimes(1000000)所有素数等于或小于一百万的调用.我将Set它存储在另一个中,因为它是通过返回一个子集来实现的,除非我将素数复制到它们自己的数据结构中,否则性能非常糟糕.
虽然素数集不是空的,但是获得下一个素数.
得到那个素数的所有轮换.例如197,971,719.这些旋转本身不需要是素数,因为无论如何我需要验证它们.
如果素数集包含所有旋转,则将旋转计数添加到运行总计.
如果存在,则从素数集中移除所有旋转.
我注意到这个代码有两个奇怪的地方.如果我使用a TreeSet存储素数,性能非常快,并产生正确的结果:
答案:55
时间:76毫秒
如果我切换到一个HashSet表现更差,结果是不正确的.
答案:50
时间:2527ms
我把代码放在顶部以仔细检查代码在代码运行之前是否包含相同的值,并且它们总是这样做.
HashSet与TreeSet?相比,为什么使用产品的结果不正确?没有空值或其他奇怪的值,只有正的,不同的Integer实例.这些集合开始包含完全相同的数据.算法是相同的,因为它是完全相同的代码.由于实现与数据大小之间的排序差异,几乎不可能比较算法运行时的状态.如果我减小输入大小,两者产生的结果相同,最高可达100,000.
当它必须执行不适用于所有那些删除和树旋转时,为什么TreeSet执行速度比HashSet它快得多HashSet?查看HashMap后面的代码,HashSet除了本地化到特定bin之外,不会调整内容的大小或改组.此外,素数相当均匀.虽然没有简单的验证方法,但我希望不会出现表中占用少量垃圾箱的许多项目的最坏情况性能问题.
代码如下.您可以Set通过交换顶部的变量名来切换实现.
import java.util.Collection;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.NavigableSet;
import java.util.TreeSet;
public class Problem_0035 {
public static void main(String[] args) {
// Swap these two variable names …Run Code Online (Sandbox Code Playgroud) 我需要String在数据结构中存储2到1,500万个帐户(长度为15),以便查找和检查唯一性.最初我计划将它们存储在a中HashSet,但是我怀疑由于散列冲突,查找的速度会很慢,并且最终会比TreeMap慢(使用二进制搜索).
不需要对数据进行排序.我正在使用Java 7.我有64G系统,48G专用于此应用程序.
这个问题不是HashSet和TreeSet性能测试的重复,因为这个问题是关于向a添加元素Set的性能,这个问题是关于检查现有的重复值的性能.Set
编辑:方法签名
public Comparable[][] findCommonElements(Comparable[][] collections)
Run Code Online (Sandbox Code Playgroud)
是错的.它应该是
public Comparable[] findCommonElements(Comparable[][] collections)
Run Code Online (Sandbox Code Playgroud)
但在我的IDE中更改它会让一切都变得混乱.我几乎觉得自己已经超出了我的知识范围,因为我并不完全理解Set,而2D数组让我很糟糕.
我需要编写一个带有两个Comparable数组的算法,以线性时间效率迭代它们,并显示公共元素.我已经读过使用HashSet会给我最快的时间效率,但我已陷入僵局.原因如下:
我们得到了指令和一行代码,这是方法签名
public Comparable[][] findCommonElements(Comparable[][] collections)
Run Code Online (Sandbox Code Playgroud)
这意味着我必须返回2d数组,"集合".我通过电子邮件发送了我的教授使用HashSets,我得到了批准,除了我有这个问题:
"你可以在你的findCommonElements方法中使用HashSet,但是你需要能够计算执行的比较次数.尽管散列通常非常有效,但是在发生碰撞时会进行一些比较.为此,你需要可以访问您使用的HashSet的源代码.您还需要在CommonElements类中使用"getComparisons()"方法来返回比较次数."
在两个学期的编程中,我没有学习HashSets,Maps,Tables等.我正在尝试自己学习,我并不完全理解碰撞.
我的代码确实采用了两个数组并返回了公共元素,但是我的返回语句很复杂,因为我基本上编写它所以它会编译(2d Comparable数组是参数).
我在正确的道路上吗?这是代码:
public class CommonElements {
static Comparable[] collection1 = {"A", "B", "C", "D", "E"}; //first array
static Comparable[] collection2 = {"A", "B", "C", "D", "E", "F", "G"}; //second array
static Comparable[][] collections = {collection1, collection2}; //array to store common elements.
static Set<Comparable> commonStuff = new HashSet<>(); //instance of Set containing common elements
public …Run Code Online (Sandbox Code Playgroud) java ×10
collections ×5
hashset ×4
algorithm ×2
arraylist ×2
hashmap ×2
performance ×2
treeset ×2
arrays ×1
comparable ×1
graph ×1
iterator ×1
linked-list ×1
map ×1
tree ×1