Java树集使用的内存是否比PriorityQueue少?

Java树集使用的内存是否比PriorityQueue少?,java,priority-queue,treeset,Java,Priority Queue,Treeset,我是这样做的,首先使用PriorityQueue解决了这个问题:- public ArrayList<Integer> solve(int A, int B, int C, int D) { PriorityQueue<Integer> q = new PriorityQueue<>(); q.add(A); q.add(B); q.add(C); ArrayList<Integer> list = new

我是这样做的,首先使用PriorityQueue解决了这个问题:-

public ArrayList<Integer> solve(int A, int B, int C, int D) {
    PriorityQueue<Integer> q = new PriorityQueue<>();
    q.add(A);
    q.add(B);
    q.add(C);
    ArrayList<Integer> list = new ArrayList<>();
    while(list.size() < D){
        int val = q.poll();
        if(list.size() == 0 || list.get(list.size() - 1) != val)
        list.add(val);
        q.add(val*A);
        q.add(val*B);
        q.add(val*C);
    }

    list.sort(null);
    return list;
}
public ArrayList solve(inta,intb,intc,intd){
PriorityQueue q=新的PriorityQueue();
q、 添加(A);
q、 添加(B);
q、 添加(C);
ArrayList=新建ArrayList();
while(list.size()
但它给出了java.lang.OutOfMemoryError:java堆空间错误。
将PriorityQueue替换为TreeSet后,该解决方案被接受:-

 public ArrayList<Integer> solve(int A, int B, int C, int D) {
    ArrayList<Integer> res = new ArrayList<>() ;

    TreeSet<Integer> set = new TreeSet<>() ;
    set.add(A) ;
    set.add(B) ;
    set.add(C) ;

    for(int i = 0; i < D; i++) {
        int temp = set.first() ;
        set.remove(temp) ;
        res.add(temp) ;

        set.add(temp*A) ;
        set.add(temp*B) ;
        set.add(temp*C) ;

    }
    return res ;
}
public ArrayList solve(inta,intb,intc,intd){
ArrayList res=新的ArrayList();
树集=新树集();
增加(A);
增加(B);
增加(C);
对于(int i=0;i
它基本上与所使用的内存量无关,只是使用
PriorityQueue
的程序永远不会结束,不断地向
PriorityQueue
添加元素


它不会结束,因为您的条件是if(list.size()==0 | | list.get(list.size()-1)!=val)
-它永远不会满足,因此检查
列表大小的while循环始终为真,所以每次循环执行都从队列中提取一个元素,然后向其中添加3个元素。

它基本上与所使用的内存量无关,只是使用
PriorityQueue
的程序永远不会结束,不断地向
PriorityQueue
添加元素


它不会结束,因为您的条件是if(list.size()==0 | | list.get(list.size()-1)!=val)
-它永远不会满足,因此检查
列表大小的while循环始终为真,所以每次循环执行都从队列中提取一个元素,然后向其中添加3个元素。

这与数据结构无关。第一种情况的参数组合可能导致此语句永远不为真:

if(list.size() == 0 || list.get(list.size() - 1) != val)
这意味着循环永远不会终止,对象
q
会增长,直到内存耗尽。例如,尝试通过以下方式调用:

求解(1,1,2,5)


在这种情况下,两个数据结构之间的内存差异没有影响。与随机访问和下一个/上一个指针相关的一些差异需要注意,但在这里不相关。

这与数据结构无关。第一种情况的参数组合可能导致此语句永远不为真:

if(list.size() == 0 || list.get(list.size() - 1) != val)
这意味着循环永远不会终止,对象
q
会增长,直到内存耗尽。例如,尝试通过以下方式调用:

求解(1,1,2,5)


在这种情况下,两个数据结构之间的内存差异没有影响。与随机访问和下一个/上一个指针相关的一些差异需要注意,但在这里并不相关。

如果您使用比
A
B
C
,更有意义的变量名,您不认为您的代码更可读吗,和
D
?功能结构由网站提供。如果您使用比
A
B
C
D
更有意义的变量名,您不认为您的代码更可读吗?功能结构由网站提供。