현재 로직은 일정 조건이 충족되면 객체를 생성후 ArrayList에 하나씩 담고 최종적으로는 for문으로 index통해 객체를 하나씩 꺼내오는 방식이고 이게 하나의 메소드로 묶여있음.
이 메소드를 실행하면 Heap space 오류가 발생하더라구
JVM heap 메모리를 늘려주면 되긴 하는데 메모리를 조금 더 효율적으로 사용하고 시간복잡도를 개선하기 위해서 ArrayList가 아니라 Queue를 사용하는게 나을까?
ArrayList보다 Queue를 사용하는게 나을 것 같다고 생각한 이유는 아래와 같음
1. ArrayList는 초기에 할당한 메모리를 넘어서게 되면 새로운 Array를 생성해서 기존 데이터를 옮기는 작업을 수행하게 되고, 이전에 사용한 Array는 GC가 치워주기 전까지는 메모리상에 존재하기 때문에 메모리 낭비가 발생할 수 있다.
2. ArrayList의 데이터 추가 시간복잡도는 O(n)이고 데이터 조회는 O(1)이고, Queue의 데이터 추가 및 데이터 deque 시간복잡도는 O(1)이기 때문에 좀 더 효율적이다.
내가 생각한 이유로 Queue를 사용하는 것이 지금 사례에서 적절할까?
코드 보여줘
Deque(Queue)의 구현체는 LinkedList랑 ArrayDeque이 있음 구현체로 LinkedList를 썼다고 가정하겠음
1. 메모리 낭비가 발생하기는 함 글에서 나온대로 array 크기를 자주 바꿔줄 경우 안 쓰는 array 때문에 GC가 더 자주 일어날 수 있고 또 array가 꽉 차서 새로운 array로 옮겨야 될 때 예를 들어서 100만개 크기의 array가 꽉 차서 200만개의 새로운 array만들어서 데이터를 옮길때 순간적으로 300만 크기의 array가 있는 것과 마찬가지이므로 최대 힙 메모리 사용량에도 영향을 줄 것 같음 물론 이게 실제로 유의미할 정도의 차이를 만들어낼지 아닐지는 나도 잘 모르겠음
2. 데이터를 추가할때 어차피 arraylist 마지막에 데이터를 계속 추가할거아냐? 그러면 시간복잡도는 O(1)임. array가 꽉 차서 옮기는 경우만 O(n)이고
아 배열이 꽉차서 옮길 때만 O(n)이야?? 그럼 ArrayList나 Queue나 그렇게 유의미한 차이는 없으려나..? - dc App
시간복잡도는 차이 없지
내가 잘못 생각한 부분이 있었구나 고마어!! - dc App