相关疑难解决方法(0)

数组列表检索顺序

我有一个java ArrayList,我添加了5个对象.

如果我遍历列表并将其打印出来,则迭代列表并再次打印出来.

这两种情况下的检索顺序是否相同?(我知道它可能与插入顺序不同)

java arraylist

15
推荐指数
3
解决办法
3万
查看次数

是什么导致java.util.HashSet和HashMap.keySet()类的iterator()稍微不可预测的排序?

六年前,我烧了几天试图追捕我完全确定的框架随机响应的地方.在精心追逐整个框架确保它全部使用相同的Random实例后,我继续追逐单步执行代码.这是高度重复的迭代自调用代码.更糟糕的是,该死的效果只会在完成大量迭代后出现.在+6小时之后,当我在javadoc中为HashSet.iterator()发现一行时,我终于处于智慧状态,表明它不能保证返回元素的顺序.然后我浏览了整个代码库,并用LinkedHashSet替换了所有HashSet实例.而且,我的框架正好向确定性生活迈进!哎呀!

我现在刚刚经历过同样的FREAKIN影响(至少这次只有3个小时).无论出于何种原因,我都错过了HashMap碰巧为其keySet()获得相同方式的细节.

这是关于这个主题的SO线程,虽然讨论从来没有完全回答我的问题:HashSet的迭代顺序

所以,我很好奇为什么会这样.鉴于我两次都有一个庞大的单线程java应用程序在完全相同的实例化/插入空间中使用完全相同的JVM参数(来自同一批处理文件的多次运行)在同一台计算机上运行,​​几乎没有其他任何运行,这可能会扰乱JVM使得HashSet和HashMap在经过大量迭代之后会表现得不可预测(并不是因为javadoc说不依赖于顺序而不一致)?

从源代码(java.util中的这些类的实现)或者你对JVM的了解(可能是某些GC影响内部java类在分配内部存储空间时获得非零内存的位置)的任何想法?

java iterator hashmap hashset

9
推荐指数
2
解决办法
3222
查看次数

在Java(1.5或更高版本)中,从Set中获取(任意)元素的最佳表现方式是什么?

在下面的代码中,我需要从toSearch中获取元素,任何元素.我无法在Set接口定义中找到有用的方法来返回该集合的单个(随机,但不是必需的随机)成员.所以,我使用了toArray()[0]技术(见下面的代码).

private Set<Coordinate> floodFill(Value value, Coordinate coordinateStart)
{
    Set<Coordinate> result = new LinkedHashSet<Coordinate>();

    Set<Coordinate> toSearch = new LinkedHashSet<Coordinate>();
    toSearch.add(coordinateStart);
    while (toSearch.size() > 0)
    {
        Coordinate coordinate = (Coordinate)toSearch.toArray()[0];
        result.add(coordinate);
        toSearch.remove(coordinate);
        for (Coordinate coordinateAdjacent: getAdjacentCoordinates(coordinate))
        {
            if (this.query.getCoordinateValue(coordinateAdjacent) == value)
            {
                if (!result.contains(coordinateAdjacent))
                {
                    toSearch.add(coordinateAdjacent);
                }
            }
        }
    }

    return result;
}
Run Code Online (Sandbox Code Playgroud)

我所讨论的另一种技术是用" toSearch.iterator().next() " 替换" (Coordinate)toSearch.toArray()[0] ".哪种技术toArray()或iterator()最有可能以最少的GC(垃圾收集)影响执行最快?

我的直觉(在编写这个问题之后)是使用迭代器的第二种技术将更快地执行并且降低GC的开销.鉴于我不知道传递的Set的实现(最可能假设HashSet或LinkedHashSet),每个toArray()或iterator()方法会产生多少开销?任何有关这方面的见解将不胜感激.

问题(从上面重复):

  1. 哪种技术toArray()或iterator()最有可能以最少的GC(垃圾收集)影响执行最快?
  2. 鉴于我不知道传递的Set的实现(最可能假设HashSet或LinkedHashSet),每个toArray()和iterator()方法会产生多少开销?

java performance iterator set toarray

8
推荐指数
1
解决办法
1010
查看次数

Java HashSet中元素的排序

为什么第二组和第三组保留顺序:

Integer[] j = new Integer[]{3,4,5,6,7,8,9};
LinkedHashSet<Integer> i = new LinkedHashSet<Integer>();
Collections.addAll(i,j);
System.out.println(i); 

HashSet<Integer> hi = new HashSet<Integer>(i);
System.out.println(hi); 

LinkedHashSet<Integer> o = new LinkedHashSet<Integer>(hi);
System.out.println(o); 
Run Code Online (Sandbox Code Playgroud)

这是我得到的输出:

3,4,5,6,7,8,9
3,4,5,6,7,8,9
3,4,5,6,7,8,9
Run Code Online (Sandbox Code Playgroud)

java collections hashset linkedhashset

6
推荐指数
2
解决办法
3万
查看次数

Java 8 HashMap KeySet()输出与Java 7不同

我从Java 7升级到Java 8,并注意到在使用HashMap的keySet()的地方出现了Junit故障.

Map<String, String> map = new HashMap<String, String>();
map.put("var1".toUpperCase(), "var");
map.put("var".toUpperCase(), "var1");
Set<String> varKeys = replacementMap.keySet();
Run Code Online (Sandbox Code Playgroud)

在Java 7中:

varKeys=[VAR,VAR1]
Run Code Online (Sandbox Code Playgroud)

在Java 8中:

varKeys=[VAR1,VAR]
Run Code Online (Sandbox Code Playgroud)

对此有何帮助?

java hashmap java-8

3
推荐指数
2
解决办法
931
查看次数