Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java HashSet相对于ArrayList的优势,反之亦然_Java_Arraylist_Hashset - Fatal编程技术网

Java HashSet相对于ArrayList的优势,反之亦然

Java HashSet相对于ArrayList的优势,反之亦然,java,arraylist,hashset,Java,Arraylist,Hashset,我对Java中的数据结构有疑问。在Java中解决一个典型的散列问题时,我使用了散列集数据结构,在出现重复对象(对象内容)之前,该结构工作正常。因为HashSet不支持插入重复项,所以我的逻辑失败了 我将hashset替换为典型的Arraylist,因为hashset的方法,如.add()、.contains()、.remove()在这两种方法中都受支持,并且我的逻辑工作得很好 但这是否一定意味着当涉及重复项时,ArrayList是Hashset的逻辑选择?Hashset与ArrayList相比应

我对Java中的数据结构有疑问。在Java中解决一个典型的散列问题时,我使用了
散列集
数据结构,在出现重复对象(对象内容)之前,该结构工作正常。因为HashSet不支持插入重复项,所以我的逻辑失败了

我将hashset替换为典型的
Arraylist
,因为hashset的方法,如.add()、.contains()、.remove()在这两种方法中都受支持,并且我的逻辑工作得很好

但这是否一定意味着当涉及重复项时,ArrayList是Hashset的逻辑选择?Hashset与ArrayList相比应该有一些时间复杂性优势,对吗?有人能给我一些关于这方面的见解吗

编辑:当涉及重复项时,如果要进行哈希运算,理想的数据结构是什么。我的意思是不应忽略重复项,而应插入重复项。

  • 使用HashMap时,它会用新的副本替换原始值
  • 使用哈希集时,将忽略(不插入)后续重复项
  • 使用ArrayList时,它只是将副本添加到列表的末尾
这一切都取决于您的需求。

  • 使用HashMap时,它会用新的副本替换原始值
  • 使用哈希集时,将忽略(不插入)后续重复项
  • 使用ArrayList时,它只是将副本添加到列表的末尾

这一切都取决于您的需求。

ArrayList
如果您不想重复,那么它就不是合乎逻辑的选择。针对不同的用例使用不同的工具


您可以在重复项没有意义的区域使用
集合
,例如,一组学生。
列表
允许重复。

ArrayList
如果您不希望重复,则不符合逻辑。针对不同的用例使用不同的工具


您可以在重复项没有意义的区域使用
集合
,例如,一组学生。
列表允许重复。

不清楚您所说的“哈希问题”是什么意思,但可能您正在寻找一个解决方案。从番石榴中:

支持顺序独立相等的集合,如Set,但可能有重复的元素。多集有时也称为包

多集合中彼此相等的元素称为同一单个元素的引用。一个元素在多集合中出现的总数称为该元素的计数(术语“频率”和“多重性”是等效的,但在本API中未使用)


JDK中不存在这样的问题。

不清楚“哈希问题”是什么意思,但可能您正在寻找一个解决方案。从番石榴中:

支持顺序独立相等的集合,如Set,但可能有重复的元素。多集有时也称为包

多集合中彼此相等的元素称为同一单个元素的引用。一个元素在多集合中出现的总数称为该元素的计数(术语“频率”和“多重性”是等效的,但在本API中未使用)


JDK中不存在这样的东西。

如果您特别需要处理重复项的
HashSet
,那么
HashMap
将能够完成这项工作。如果您只需要计算添加的对象数量(使用快速查找/etc),则理想的方法是使用
HashMap
,其中
T
是对象的类型。如果您确实需要保留对已添加的重复对象的引用,请使用
HashMap
。通过这种方式,您可以使用HashMap的
.containsKey(T)
进行查找,并迭代结果列表中所有类似的哈希对象。例如,您可以创建以下类:

public class HashSetWithDuplicates<T> {

    private HashMap<T, List<T>> entries;
    private int size;

    public HashSetWithDuplicates(){
        entries = new HashMap<>();
        size = 0;
    }

    public HashSetWithDuplicates(Collection<? extends T> col){
        this();
        for(T t : col){
            add(t);
        }
    }

    public boolean contains(T t){
        return entries.containsKey(t);
    }

    public List<T> get(T t){
        return entries.get(t);
    }

    public void add(T t){
        if (!contains(t)) entries.put(t, new ArrayList<>());

        entries.get(t).add(t);
        size++;
    }

    public void remove(T t){
        if (!contains(t)) return;
        entries.get(t).remove(t);
        if(entries.get(t).isEmpty()) entries.remove(t);
        size--;
    }

    public int size(){
        return size;
    }

    public boolean isEmpty(){
        return size() == 0;
    }
}
具有重复项的公共类哈希集{
私有HashMap条目;
私有整数大小;
公共HashSetWithDuplicates(){
entries=newhashmap();
尺寸=0;
}

公共HashSetWithDuplicates(Collection如果您特别需要处理重复项的
HashSet
,则
HashMap
将能够完成此任务。如果您只需要计算添加的对象数(使用快速查找/etc),一个
HashMap
将是理想的,其中
T
是您的对象的类型。如果您确实需要保留对已添加的重复对象的引用,请使用
HashMap
。这样您就可以使用HashMap的
进行查找。containsKey(T)
,并遍历结果列表中所有类似的哈希对象。例如,您可以创建以下类:

public class HashSetWithDuplicates<T> {

    private HashMap<T, List<T>> entries;
    private int size;

    public HashSetWithDuplicates(){
        entries = new HashMap<>();
        size = 0;
    }

    public HashSetWithDuplicates(Collection<? extends T> col){
        this();
        for(T t : col){
            add(t);
        }
    }

    public boolean contains(T t){
        return entries.containsKey(t);
    }

    public List<T> get(T t){
        return entries.get(t);
    }

    public void add(T t){
        if (!contains(t)) entries.put(t, new ArrayList<>());

        entries.get(t).add(t);
        size++;
    }

    public void remove(T t){
        if (!contains(t)) return;
        entries.get(t).remove(t);
        if(entries.get(t).isEmpty()) entries.remove(t);
        size--;
    }

    public int size(){
        return size;
    }

    public boolean isEmpty(){
        return size() == 0;
    }
}
具有重复项的公共类哈希集{
私有HashMap条目;
私有整数大小;
公共HashSetWithDuplicates(){
entries=newhashmap();
尺寸=0;
}

公共HashSetWithDuplicates(CollectionBut Hashset在哈希要求方面比arraylist有一些时间复杂度优势,对吗?否则,当您可以使用arraylist实现同样的要求时,为什么需要Hashset?为了简单起见…如果您需要确保不允许重复,为什么要使用arraylist?请参阅我的编辑。我希望重复项可以被删除。)e inserted,不应被忽略。通过散列,我猜您希望能够通过其散列值来识别对象?不管怎样,我怀疑您想要的是arraylist,但在散列要求方面,Hashset比arraylist具有一些时间复杂度优势,对吗?否则,当您可以实现相同的usin时,为什么需要Hashsetg arraylist?为了简单起见…如果您需要确保不允许重复,为什么要使用arraylist?请参阅我的编辑。我希望重复项