Tag: 集合

数组列表算法 – 访谈

我今天在接受采访时被问到这个问题。 我尝试过一个解决方案,但想知道是否有更好的解决方法: 问题 :我有一个arraylist说500,000个元素,使得arraylist的每个元素的值与索引相同。 例如:list.get(0)= 0; list.get(1)= 1 …等。 但只有一个元素与此排序不同步[即list.get(i)!= i]。 你怎么找到这个元素。 我的答案 :使用多个线程迭代列表,每个线程在每次比较list.get(i)和i时处理arraylist的某个拼接。 找到元素后,设置一些布尔变量以向其他线程指示已找到该元素。 有没有办法解决这个问题而不迭代列表? 还是更好的方法?

检测并发修改?

在我正在研究的multithreading应用程序中,我们偶尔会在列表中看到ConcurrentModificationExceptions (主要是ArrayList ,有时是Vectors)。 但是还有一些时候我认为并发修改正在发生,因为遍历集合似乎缺少项目,但没有抛出exception。 我知道ConcurrentModificationException的文档说你不能依赖它,但我如何确保我不会同时修改List? 并且在同步块中包装对集合的每次访问是防止它的唯一方法吗? 更新:是的,我知道Collections.synchronizedCollection ,但它不会防止有人在你迭代它时修改集合。 我认为至少有一些问题发生在我正在迭代它时有人向集合添加内容时。 第二次更新如果有人想结合提到的synchronizedCollection和像Jason那样的克隆,提到java.util.concurrent和像jacekfoo和Javamann那样的apache集合框架,我可以接受一个答案。

Java集合:将子集合作为父集合传递

假设我有一个接口和一些类: public interface IPanel { public void addComponents(Set components); public ComponentType create(); } public class Button extends Component { } public class LocalizedButton extends Button { } public class ButtonsPanel implements IPanel { public void addComponents(Set components) { … /* uses create() */ ; } public Button create() { return new Button(); } } public […]

为什么我在创建Map时会收到IllegalArgumentException?

我正在尝试创建一个城市和温度的地图,但它正在抛出IllegalArgumentException 。 这就是我正在做的事情: Map tempMap = Map.of(“London”, 13, “Paris”, 17, “Amsterdam”, 13, “Madrid”, 21, “Rome”, 19, “London”, 13, “Bonn”, 14, “Moscow”, 7, “Barcelona”, 20, “Berlin”, 15); 如果我逐个添加它们就没问题了: Map tempMap = new Hashmap(); // or LinkedHashMap tempMap.put(“London”, 13); tempMap.put(“Madrid”, 21); tempMap.put(“Moscow”, 7); // etc. 为什么会这样? 内容应该是不一样的吗?

在AbstractCollection的toArray方法的实现中,代码的用法是什么

public Object[] toArray() { // Estimate size of array; be prepared to see more or fewer elements Object[] r = new Object[size()]; Iterator it = iterator(); for (int i = 0; i < r.length; i++) { if (! it.hasNext()) // fewer elements than expected return Arrays.copyOf(r, i); r[i] = it.next(); } return it.hasNext() ? finishToArray(r, […]

需要一个Java映射/表,其中包含一个值的多个键。 价值通常会改变

我需要的是一个允许多个键访问单个对象的集合。 我需要对这个对象进行频繁的修改。 对于500k +条目,它也必须是高效的。

迭代EnumMap#entrySet

枚举Map#entrySet对于所有Map实现都没有预期的效果,特别是对于EnumMap, IdentityHashMap ,这里是来自Josh Bloch的益智游戏(Puzzle 5)的示例代码 – public class Size { private enum Sex { MALE, FEMALE } public static void main(String[] args) { printSize(new HashMap()); printSize(new EnumMap(Sex.class)); } private static void printSize(Map map) { map.put(Sex.MALE, Sex.FEMALE); map.put(Sex.FEMALE, Sex.MALE); map.put(Sex.MALE, Sex.MALE); map.put(Sex.FEMALE, Sex.FEMALE); Set<Map.Entry> set = new HashSet<Map.Entry>(map.entrySet()); System.out.println(set.size()); } } 是的,这会产生错误的结果 – 应该是 2 2 […]

让你的collections线程安全吗?

在设计集合类时,有没有理由不私下实现锁定以使其线程安全? 或者我应该将该责任留给collections的消费者?

具有静态generics的类型安全,通用,空集合

我尽可能返回空集合与null。 我使用java.util.Collections在两种方法之间切换: return Collections.EMPTY_LIST; return Collections.emptyList(); 其中emptyList()应该是类型安全的。 但我最近发现: return Collections. emptyList(); return Collections. singletonList(new ComplexObject()); 等等 我在Eclipse Package Explorer中看到了这个方法: () : void 但我不知道在源代码(1.5)中是如何完成的。 怎么这个神奇的tomfoolerie发生了! 编辑:如何完成静态通用类型?

当我对List进行排序时,它的迭代器会发生什么?

假设我有一个List对象和该列表的迭代器 。 现在我用java.util.Collections.sort()对列表进行排序 迭代器会发生什么? 它的行为是否仍然定义,是否仍然可以使用? 如果没有,我可以阻止销毁列表的迭代器吗? 我知道,这个问题可以通过改变程序设计来克服,例如克隆列表,但我特别想知道Java的“官方”行为。