Java 存储唯一整数的好方法

Java 存储唯一整数的好方法,java,collections,unique,Java,Collections,Unique,我的问题是:如何快速确定一个数字是否包含在集合中,以了解是否将其添加到集合中并保持唯一性。如果我能帮上忙的话,我宁愿不要反复浏览这个列表 我有一个名为numberList的列表。我希望它存储唯一的整数,并且永远不允许添加重复的整数。我想这样做: private void add(int number) { if (!numberList.contains(number)) { numberList.add(number); } } 但很明显,这是行不通的,因为numberLis

我的问题是:如何快速确定一个数字是否包含在
集合中,以了解是否将其添加到集合中并保持唯一性。如果我能帮上忙的话,我宁愿不要反复浏览这个列表

我有一个名为
numberList
列表。我希望它存储唯一的整数,并且永远不允许添加重复的整数。我想这样做:

private void add(int number) {
  if (!numberList.contains(number)) {
    numberList.add(number);
  }
}
但很明显,这是行不通的,因为
numberList
包含一个
Integer
对象列表,所以无论每个对象的数量如何,它们都是唯一的对象


谢谢

一种方法是将整数存储在
集合
中,例如
哈希集合
。集合不允许重复

编辑
此外,集合的
contains(…)
方法使用对象的equals(…)方法查看它是否由集合持有,因此,如果需要使用列表作为集合,上面的方法也将防止重复。你自己测试一下,你会发现它是如此

例如:

  List<Integer> numberList = new ArrayList<Integer>();
  int[] myInts = {1, 1, 2, 3, 3, 3, 3, 4};
  for (int i : myInts) {
     if (!numberList.contains(i)) {
        numberList.add(i);
      }
  }

  System.out.println(numberList);
List numberList=new ArrayList();
int[]myInts={1,1,2,3,3,3,4};
用于(整数i:myInts){
如果(!numberList.contains(i)){
数字列表。添加(i);
}
}
System.out.println(numberList);
将返回:
[1,2,3,4]


此外,哈希集的一个可能问题是它们没有排序,因此,如果排序很重要,您需要考虑使用其他类型的排序集。

最紧凑的形式不是
位集吗?它的存储效率很高,因为它将无限期地扩展。它也不会不必要地使用存储


您是否在多线程环境中工作?如果是这样,还有其他结构可能更好/更有效。

我认为
contains(…)
方法使用对象的
equals(…)
方法来查看它是否由集合持有,因此您上面的方法也应该防止重复。嗯,也许我的代码出了什么问题,导致了意想不到的结果。谢谢你的提示!如果你的代码和我的一样,那么总有其他错误!如果您需要帮助查找,请返回更多信息!出于好奇,您认为哪种实现更快?在添加之前,让
集合
处理重复项或者在列表中使用
包含
会更快吗?@kentcdoffics:我相信哈希集会更快,因为哈希是一种非常快速的操作,但我不能100%肯定地说,因为我从未研究过算法的大O。不过,稍等一下,毫无疑问,一位计算机科学家很快就会回答这个问题。当然,使用哈希集更快。还可以避免使用
if(!contains)add..
模式,因为HashSet.add会在内部进行检查,如果向集合中添加了新元素,则返回true。明白了!这是一个多线程环境,这就是为什么我要这么做。我想检查是否有一个线程已经添加了数字。在这种情况下,您几乎可以肯定要查找
ConcurrentHashMap
,它可能包含在使用派生的集合中,但如果您愿意,您可以始终将
布尔值添加到
映射中。对于小而密集的数字集合,位集非常有效。但是
new BitSet().add(Integer.MAXVALUE)已分配268MB。所以应该小心地使用它。@Arne-对,但只要该元素存在于集合中,它就永远不会分配它。当然,并非对每个用例都有用,但在某些情况下,不会进行进一步的分配,并且极低的常数因子使其非常有吸引力。